In [1]:
import os
import pandas as pd
import cv2
import matplotlib.pyplot as plt
import numpy as np
cwd = os.getcwd()

%matplotlib inline

import io
import base64
from IPython.display import HTML

#set image color space
colorspace = cv2.COLOR_BGR2RGB

import pickle
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import random
from sklearn.preprocessing import StandardScaler

from sklearn.svm import LinearSVC, SVC
# NOTE: the next import is only valid for scikit-learn version <= 0.17
# for scikit-learn >= 0.18 use:
from sklearn.model_selection import train_test_split, GridSearchCV
# from sklearn.cross_validation import train_test_split
import time
from scipy.ndimage.measurements import label

from moviepy.editor import VideoFileClip
from IPython.display import HTML

import glob

from skimage import data, color, exposure
from skimage.feature import hog

Step 0: Load The Training Data

In [2]:
vehicles_dir = ['/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/vehicles/GTI_Far',
                '/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/vehicles/GTI_Left',
                '/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/vehicles/GTI_Right',
                '/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/vehicles/GTI_MiddleClose',
                '/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/vehicles/KITTI_extracted']

non_vehicles_dir = ['/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/non-vehicles/Extras',
                    '/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/non-vehicles/GTI']
                
cars = []
notcars = []

for dir_name in vehicles_dir:
    items = os.listdir(dir_name)
    for names in items:
        if names.endswith(".png") or names.endswith(".jpg"):
            img = mpimg.imread(os.path.join(dir_name,names))
            cars.append(img)

for dir_name in non_vehicles_dir:
    items = os.listdir(dir_name)
    for names in items:
        if names.endswith(".png") or names.endswith(".jpg"):
            img = mpimg.imread(os.path.join(dir_name,names))
            notcars.append(img)

print("Number of training images of cars: ", len(cars))
print("Number of training images of not-cars: ", len(notcars))

nSamples = 3
f, axarr = plt.subplots(nSamples,2,figsize=(5, 10))

samples = []
car_imgs = []
notcar_imgs = []

for i in range(nSamples):
    samples.append(random.randint(0, len(cars)))
    car_imgs.append(cars[samples[i]]) 
    notcar_imgs.append(notcars[samples[i]])
    
for i in range(nSamples):
    rand_index = samples[i]
    axarr[i,0].imshow(cars[rand_index])
    axarr[i,1].imshow(notcars[rand_index])
    axarr[i,0].set_xticks([])
    axarr[i,0].set_yticks([])
    axarr[i,0].set_title("Car Image #" + str(rand_index))
    
    axarr[i,1].set_xticks([])
    axarr[i,1].set_yticks([])
    axarr[i,1].set_title("Not-Car Image #" + str(rand_index))    
Number of training images of cars:  8792
Number of training images of not-cars:  8968

Step-0a: Data Description

In [3]:
print(len(cars), len(car_imgs), cars[0].shape)
print(len(notcars), len(notcar_imgs), notcars[0].shape)
print(np.min(cars[0][:,:,0]),np.min(cars[0][:,:,1]),np.min(cars[0][:,:,2]))
print(np.max(cars[0][:,:,0]),np.max(cars[0][:,:,1]),np.max(cars[0][:,:,2]))
8792 3 (64, 64, 3)
8968 3 (64, 64, 3)
0.129412 0.14902 0.133333
0.745098 0.752941 0.690196

Step 1a: Color Space Transformation

Both HSV & YCrCb were tried. HSV transformation presented issues in detecting white cars on white roads. YCrCb seemed to be a better choice.

In [4]:
cspace = 'YCrCb'#'HSV'#

def change_cspace(image,color_space):
    if color_space != 'RGB':
        if color_space == 'HSV':
            feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
        elif color_space == 'LUV':
            feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2LUV)
        elif color_space == 'HLS':
            feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2HLS)
        elif color_space == 'YUV':
            feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2YUV)
        elif color_space == 'YCrCb':
            feature_image = cv2.cvtColor(image, cv2.COLOR_RGB2YCrCb)
        else:
            feature_image = np.copy(image)
    return feature_image
In [5]:
cars_cspace = []
notcars_cspace = []
f, axarr = plt.subplots(nSamples,2,figsize=(5, 10))
for i in range(nSamples):
    if cspace == 'YCrCb':
        cars_cspace.append(change_cspace(car_imgs[i], cspace))
        notcars_cspace.append(change_cspace(notcar_imgs[i], cspace))        
    else:
        cars_cspace.append(change_cspace(car_imgs[i]*255.0, cspace))
        notcars_cspace.append(change_cspace(notcar_imgs[i]*255.0, cspace))
#     print(np.min(cars_cspace[i]),np.max(cars_cspace[i]))
#     print(np.min(notcars_cspace[i]),np.max(notcars_cspace[i]))    
#     print()
    axarr[i,0].imshow(cars_cspace[i])#/255.0)
    axarr[i,1].imshow(notcars_cspace[i])#/255.0)
    axarr[i,0].set_xticks([])
    axarr[i,0].set_yticks([])
    axarr[i,0].set_title("Car Image # " + str(samples[i]) + "in" +  cspace)
    
    axarr[i,1].set_xticks([])
    axarr[i,1].set_yticks([])
    axarr[i,1].set_title("Not-Car Image #" + str(samples[i]) + "in" +  cspace)

Step 1b: Spatial bins

The pixed values of the raw image transformed into the YCrCb colorspace in Step 1a are then concatenated into a single vector feature for spatial analysis.

In [6]:
spatial_size = (32,32)
def bin_spatial(image, size=(32, 32)):
    features = cv2.resize(image, size).ravel()
    return features
In [7]:
cars_spatialHist = []
notcars_spatialHist = []
f, axarr = plt.subplots(nSamples,4,figsize=(20, 10))
for i in range(nSamples):
    cars_spatialHist.append(bin_spatial(cars_cspace[i]))
    notcars_spatialHist.append(bin_spatial(notcars_cspace[i]))
#     print(np.min(cars_cspace[i]),np.max(cars_cspace[i]),np.min(notcars_cspace[i]),np.max(notcars_cspace[i]))
    axarr[i,0].imshow(cars[samples[i]])
    axarr[i,2].imshow(notcars[samples[i]])
    axarr[i,0].set_xticks([])
    axarr[i,0].set_yticks([])
    axarr[i,0].set_title("Car Image # " + str(samples[i]))
    axarr[i,2].set_xticks([])
    axarr[i,2].set_yticks([])
    axarr[i,2].set_title("Not-Car Image #" + str(samples[i]))
    
    axarr[i,1].plot(range(len(cars_spatialHist[i])),cars_spatialHist[i])
    axarr[i,3].plot(range(len(notcars_spatialHist[i])),notcars_spatialHist[i])
    axarr[i,1].set_title("Spatial features of Car Image # " + str(samples[i]))
    axarr[i,3].set_title("Spatial features of Not-Car Image # " + str(samples[i]))    

Step-1c: Histogram of color features

The histogram of the raw image is then computed and compared between the sample ar & non-car images.

In [8]:
nbins = 32
def color_hist(image, nbins=32):
    if len(image.shape) > 1:
        features = []
        for i in range(image.shape[2]):
            # Compute the histogram of the color channels separately
            hist,edges = np.histogram(image[:, :, i], bins=nbins)#, range = (0,256))
            features.append(hist)
        hist_features = np.concatenate(features)
    else:
        hist_features, edges = np.histogram(image, bins=nbins)#, range = (0,256))

    return hist_features
In [9]:
cars_colorHist = []
notcars_colorHist = []
f, axarr = plt.subplots(nSamples,4,figsize=(20, 10))
for i in range(nSamples):
    cars_colorHist.append(color_hist(car_imgs[i]))#cars_cspace[i]))#
    notcars_colorHist.append(color_hist(notcar_imgs[i]))#notcars_cspace[i]))#
    axarr[i,0].imshow(cars[samples[i]])
    axarr[i,2].imshow(notcars[samples[i]])
    axarr[i,0].set_xticks([])
    axarr[i,0].set_yticks([])
    axarr[i,0].set_title("Car Image # " + str(samples[i]))
    axarr[i,2].set_xticks([])
    axarr[i,2].set_yticks([])
    axarr[i,2].set_title("Not-Car Image #" + str(samples[i]))
    
    axarr[i,1].plot(range(len(cars_colorHist[i])),cars_colorHist[i])
    axarr[i,3].plot(range(len(notcars_colorHist[i])),notcars_colorHist[i])
    axarr[i,1].set_title("Color Histogram of Car Image # " + str(samples[i]))
    axarr[i,3].set_title("Color Histogram of Not-Car Image # " + str(samples[i]))  

Step 1d: HOG feature exploration

For analysis of the directional information in each of the images, the histogram of oriented gradients (hog) is then taken and plotted. While taking the HOG, it is desirable to concatenate the hog information from all channels of the transformed image into a single vector. This will eliminate any biases towards cars of a given color that may arise by just looking at hog from any individual channel

In [10]:
def get_hog_features(image, hog_channel = "ALL", orient = 9, pix_per_cell = 8, cell_per_block = 2,
                     vis=False, feature_vec=True):
    if len(image.shape) > 1 and hog_channel == "ALL":
        features = []
        vis_image = []
        for i in range(image.shape[2]):
            # Compute the histogram of the color channels separately
            hog_vals, hog_image = hog(image[:,:,i], orientations=orient,
                                      pixels_per_cell=(pix_per_cell, pix_per_cell),
                                      cells_per_block=(cell_per_block, cell_per_block),
                                      transform_sqrt=True,
                                      visualise=True, feature_vector=feature_vec)
            if vis_image == []:
                vis_image = hog_image
            else:
                vis_image = np.dstack((vis_image,hog_image))               
            features.append(hog_vals)
        hog_features = np.concatenate(features)
    elif len(image.shape) > 1 and hog_channel != "ALL":
        hog_vals, hog_image = hog(image[:,:,hog_channel], orientations=orient,
                                  pixels_per_cell=(pix_per_cell, pix_per_cell),
                                  cells_per_block=(cell_per_block, cell_per_block),
#                                   transform_sqrt=True,
                                  visualise=True, feature_vector=feature_vec)
        hog_features = hog_vals
        vis_image = hog_image
    else:
        hog_vals, hog_image = hog(image, orientations=orient,
                                  pixels_per_cell=(pix_per_cell, pix_per_cell),
                                  cells_per_block=(cell_per_block, cell_per_block),
#                                   transform_sqrt=True,
                                  visualise=True, feature_vector=feature_vec)
        hog_features = hog_vals
        vis_image = hog_image
        
    if vis == True:
        return hog_features, hog_image
    else:
        return hog_features
In [11]:
orient = 9
pix_per_cell = 8
cell_per_block = 2
hog_channel = "ALL" # Can be 0, 1, 2, or "ALL"
vis = True
feature_vec = True

cars_hog = []
notcars_hog = []
f, axarr = plt.subplots(nSamples,4,figsize=(20, 10))
for i in range(nSamples):
    cars_hog.append(get_hog_features(cars_cspace[i]))#,hog_channel = 0))
    notcars_hog.append(get_hog_features(notcars_cspace[i]))#,hog_channel = 0))
    axarr[i,0].imshow(cars[samples[i]])
    axarr[i,2].imshow(notcars[samples[i]])
    axarr[i,0].set_xticks([])
    axarr[i,0].set_yticks([])
    axarr[i,0].set_title("Car Image # " + str(samples[i]))
    axarr[i,2].set_xticks([])
    axarr[i,2].set_yticks([])
    axarr[i,2].set_title("Not-Car Image #" + str(samples[i]))
    
    axarr[i,1].plot(range(len(cars_hog[i])),cars_hog[i])
    axarr[i,3].plot(range(len(notcars_hog[i])),notcars_hog[i])
    axarr[i,1].set_title("Color Histogram of Car Image # " + str(samples[i]))
    axarr[i,3].set_title("Color Histogram of Not-Car Image # " + str(samples[i]))         

Step 2: Combined Feature Vector

A combined feature vector from the spatial data, color histogram and hog information is then concatenated into a single feature vector for supervised learning.

In [12]:
def single_img_features(image, color_space='RGB', spatial_size=(32, 32),
                        hist_bins=32, orient=9,
                        pix_per_cell=8, cell_per_block=2, hog_channel=0,
                        spatial_feat=True, hist_feat=True, hog_feat=True):
    # 1) Define an empty list to receive features
    img_features = []
    # 2) Apply color conversion if other than 'RGB'
    feature_image = change_cspace(image,color_space)
    # 3) Compute spatial features if flag is set
    if spatial_feat == True:
        spatial_features = bin_spatial(feature_image, size=spatial_size)
        # 4) Append features to list
        img_features.append(spatial_features)
    # 5) Compute histogram features if flag is set
    if hist_feat == True:
        hist_features = color_hist(image, nbins=hist_bins)
        # 6) Append features to list
        img_features.append(hist_features)
    # 7) Compute HOG features if flag is set
    if hog_feat == True:
        hog_features = get_hog_features(feature_image, hog_channel = hog_channel, orient = orient,
                                        pix_per_cell = pix_per_cell, cell_per_block = cell_per_block,
                                        vis=False, feature_vec=True)
        # 8) Append features to list
        img_features.append(hog_features)

    # 9) Return concatenated array of features
    return np.concatenate(img_features)
In [13]:
f, axarr5 = plt.subplots(nSamples,4,figsize=(20, 10))
cars_feature_vector_list = []
notcars_feature_vector_list = []
for i in range(nSamples):
    features1 = single_img_features(car_imgs[i], color_space=cspace, spatial_size=spatial_size,
                             hist_bins=nbins, orient=orient, 
                             pix_per_cell=pix_per_cell, cell_per_block=cell_per_block, hog_channel=hog_channel,
                             spatial_feat=True, hist_feat=True, hog_feat=True)

    features2 = single_img_features(notcar_imgs[i], color_space=cspace, spatial_size=spatial_size,
                             hist_bins=nbins, orient=orient, 
                             pix_per_cell=pix_per_cell, cell_per_block=cell_per_block, hog_channel=hog_channel,
                             spatial_feat=True, hist_feat=True, hog_feat=True)
    
    cars_feature_vector_list.append(features1)
    notcars_feature_vector_list.append(features2)

print(len(features1), len(features2))
# bin_centers = np.array(range(len(features1[0]))).astype(float)+0.5
for i in range(nSamples):
    axarr5[i,0].imshow(cars[samples[i]])
    axarr5[i,1].plot(range(len(cars_feature_vector_list[i])),cars_feature_vector_list[i])
    axarr5[i,2].imshow(notcars[samples[i]])
    axarr5[i,3].plot(range(len(notcars_feature_vector_list[i])),notcars_feature_vector_list[i])

    axarr5[i,0].set_xticks([])
    axarr5[i,0].set_yticks([])        
    axarr5[i,0].set_title("Car Image #" + str(samples[i]))
    axarr5[i,1].set_title("Feature vector for Car Image #" + str(samples[i]))    
    axarr5[i,2].set_xticks([])
    axarr5[i,2].set_yticks([])        
    axarr5[i,2].set_title("Not-Car Image #" + str(samples[i]))
    axarr5[i,3].set_title("Feature vector for Not-Car Image #" + str(samples[i]))    
8460 8460

Step 3: Scaling the feature vector

Note that the three features looked at have different scales. The color histogram seems to dominate the overall feature vector. Before supervised learning is started, the feature vector is scaled to overcome any issues with biases that may arise due to the different orders of magnitudes present in the feature vector.

In [14]:
f, axarr6 = plt.subplots(nSamples,4,figsize=(20, 10))
for i in range(nSamples):
    
    X_scaler1 = StandardScaler().fit(cars_feature_vector_list[i].reshape(-1,1))
    # Apply the scaler to X
    scaled_X1 = X_scaler1.transform(cars_feature_vector_list[i].reshape(-1,1))

    X_scaler2 = StandardScaler().fit(notcars_feature_vector_list[i].reshape(-1,1))
    # Apply the scaler to X
    scaled_X2 = X_scaler2.transform(notcars_feature_vector_list[i].reshape(-1,1))

    axarr6[i,0].imshow(cars[samples[i]])
    axarr6[i,1].plot(range(len(scaled_X1)),scaled_X1)
    axarr6[i,2].imshow(notcars[samples[i]])
    axarr6[i,3].plot(range(len(scaled_X2)),scaled_X2)

    axarr6[i,0].set_xticks([])
    axarr6[i,0].set_yticks([])        
    axarr6[i,0].set_title("Car Image #" + str(samples[i]))
    axarr6[i,1].set_title("Scaled Feature vector for Car Image #" + str(samples[i]))
    axarr6[i,2].set_xticks([])
    axarr6[i,2].set_yticks([])            
    axarr6[i,2].set_title("Not-Car Image #" + str(samples[i]))
    axarr6[i,3].set_title("Scaled Feature vector for Not-Car Image #" + str(samples[i]))  

Step 4: Supervised Learning: Support Vector Machine

The test car and not-car images were loaded and split into a training and testing dataset. 20% of the total dataset was chosen randomly as the testing dataset. The parameters used to extract the feature vector from the raw images are listed below.

In [15]:
cspace= 'YCrCb'#'HSV'#
orient = 9
pix_per_cell = 8 # HOG pixels per cell
cell_per_block = 2 # HOG cells per block
hog_channel = "ALL" # Can be 0, 1, 2, or "ALL"
spatial_size = (32, 32)
nbins = 32
spatial_feat = True
hist_feat = True
hog_feat = True
In [16]:
car_features = []
for i in range(len(cars)):
    if cspace == 'YCrCb':
        features = single_img_features(cars[i], color_space=cspace, spatial_size=spatial_size,
                                       hist_bins=nbins, orient=orient, pix_per_cell=pix_per_cell,
                                       cell_per_block=cell_per_block, hog_channel=hog_channel,
                                       spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat)        
    else:
        features = single_img_features(cars[i]*255.0, color_space=cspace, spatial_size=spatial_size,
                                       hist_bins=nbins, orient=orient, pix_per_cell=pix_per_cell,
                                       cell_per_block=cell_per_block, hog_channel=hog_channel,
                                       spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat)
    if i == 0:
        car_features = np.array(features)
    else:
        car_features = np.vstack((car_features,features))
        
print(car_features.shape)
(8792, 8460)
In [17]:
notcar_features = []
for i in range(len(notcars)):
    if cspace == 'YCrCb':
        features = single_img_features(notcars[i], color_space=cspace, spatial_size=spatial_size,
                                    hist_bins=nbins, orient=orient, pix_per_cell=pix_per_cell,
                                    cell_per_block=cell_per_block, hog_channel=hog_channel,
                                    spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat)    
    else:
        features = single_img_features(notcars[i]*255.0, color_space=cspace, spatial_size=spatial_size,
                                    hist_bins=nbins, orient=orient, pix_per_cell=pix_per_cell,
                                    cell_per_block=cell_per_block, hog_channel=hog_channel,
                                    spatial_feat=spatial_feat, hist_feat=hist_feat, hog_feat=hog_feat)
    if i == 0:
        notcar_features = np.array(features)
    else:
        notcar_features = np.vstack((notcar_features,features))
print(notcar_features.shape)
(8968, 8460)

A standard scaler fit was applied to the feature vector to normalize the features.

In [18]:
X = np.vstack((car_features, notcar_features)).astype(np.float64)#.reshape(-1,1)
X_scaler = StandardScaler().fit(X)
# Apply the scaler to X
scaled_X = X_scaler.transform(X)
y = np.hstack((np.ones(len(car_features)), np.zeros(len(notcar_features))))
In [19]:
rand_state = np.random.randint(0, 100)
X_train, X_test, y_train, y_test = train_test_split(
    scaled_X, y, test_size=0.2, random_state=rand_state)

print('Using:',orient,'orientations',pix_per_cell,
    'pixels per cell and', cell_per_block,'cells per block')
print('Feature vector length:', len(X_train[0]))
print('Training data size: ', len(X_train))
print('Test data size: ', len(X_test))
Using: 9 orientations 8 pixels per cell and 2 cells per block
Feature vector length: 8460
Training data size:  14208
Test data size:  3552

Step 4a: Testing out different parametes of the Support Vector Machine classifier

The C parameter of the Linear SVC was varied from 0.1 to 4 to compare training time and accuracy. It was found that accuracy was not affected by choice of C, while a higher C value lead to faster training time.

In [20]:
# Use a linear SVC 
c_param = [0.1,0.4,0.7,1,2,3,4]
for c in c_param:
    svc = LinearSVC(C = c)
#     print(svc)
    # Check the training time for the SVC
    t=time.time()
    svc.fit(X_train, y_train)
    t2 = time.time()
    print(round(t2-t, 2), 'Seconds to train SVC...')
    # Check the score of the SVC
    print('Test Accuracy of SVC with C = ', c ,' is: ', round(svc.score(X_test, y_test), 4))
    # Check the prediction time for a single sample
    t=time.time()
    pred_index = np.random.randint(0, len(X_test)-1)
    y_pred = svc.predict(X_test[pred_index,:])
    print("Prediction: ", y_pred)
    print("Actual: ", y_test[pred_index])  
    t2 = time.time()
    print(round(t2-t, 2), 'Seconds to predict SVC...')    
    print()
    svc = None
32.81 Seconds to train SVC...
Test Accuracy of SVC with C =  0.1  is:  0.9885
Prediction:  [ 0.]
Actual:  0.0
0.03 Seconds to predict SVC...

26.01 Seconds to train SVC...
Test Accuracy of SVC with C =  0.4  is:  0.9885
Prediction:  [ 0.]
Actual:  0.0
0.0 Seconds to predict SVC...

23.5 Seconds to train SVC...
Test Accuracy of SVC with C =  0.7  is:  0.9885
Prediction:  [ 0.]
Actual:  0.0
0.01 Seconds to predict SVC...

9.21 Seconds to train SVC...
Test Accuracy of SVC with C =  1  is:  0.9885
Prediction:  [ 1.]
Actual:  1.0
0.0 Seconds to predict SVC...

7.23 Seconds to train SVC...
Test Accuracy of SVC with C =  2  is:  0.9885
Prediction:  [ 1.]
Actual:  1.0
0.0 Seconds to predict SVC...

6.75 Seconds to train SVC...
Test Accuracy of SVC with C =  3  is:  0.9885
Prediction:  [ 1.]
Actual:  1.0
0.0 Seconds to predict SVC...

6.57 Seconds to train SVC...
Test Accuracy of SVC with C =  4  is:  0.9885
Prediction:  [ 0.]
Actual:  0.0
0.0 Seconds to predict SVC...

Step-4b: Classification with the best parameters

The best C parameter was found to be 4 since it resulted in the fastest training time.

In [21]:
svc = LinearSVC(C = 4)
# Check the training time for the SVC
t=time.time()
svc.fit(X_train, y_train)
t2 = time.time()
print(round(t2-t, 2), 'Seconds to train SVC...')
# Check the score of the SVC
print('Test Accuracy of SVC = ', round(svc.score(X_test, y_test), 4))
6.83 Seconds to train SVC...
Test Accuracy of SVC =  0.9885

Step 5: Search Windows

Now that the classifier is trained on 64x64 images of cars and not-cars, the dashcam image is "windowed" with each window being passed through the classifier.

In [22]:
# Here is your draw_boxes function from the previous exercise
def draw_boxes(img, bboxes, color=(0, 0, 255), thick=6):
    # Make a copy of the image
    imcopy = np.copy(img)
    # Iterate through the bounding boxes
    for bbox in bboxes:
        # Draw a rectangle given bbox coordinates
        cv2.rectangle(imcopy, bbox[0], bbox[1], color, thick)
    # Return the image copy with boxes drawn
    return imcopy

# Define a function that takes an image,
# start and stop positions in both x and y, 
# window size (x and y dimensions),  
# and overlap fraction (for both x and y)
def slide_window(image_shape, x_start_stop=[None, None], y_start_stop=[None, None], 
                    xy_window=(64, 64), xy_overlap=(0.5, 0.5)):
    # If x and/or y start/stop positions not defined, set to image size
    if x_start_stop[0] == None:
        x_start_stop[0] = 0
    if x_start_stop[1] == None:
        x_start_stop[1] = image_shape[1]
    if y_start_stop[0] == None:
        y_start_stop[0] = 0
    if y_start_stop[1] == None:
        y_start_stop[1] = image_shape[0]
    # Compute the span of the region to be searched    
    xspan = x_start_stop[1] - x_start_stop[0]
    yspan = y_start_stop[1] - y_start_stop[0]
    # Compute the number of pixels per step in x/y
    nx_pix_per_step = np.int(xy_window[0]*(1 - xy_overlap[0]))
    ny_pix_per_step = np.int(xy_window[1]*(1 - xy_overlap[1]))
    # Compute the number of windows in x/y
    nx_buffer = np.int(xy_window[0]*(xy_overlap[0]))
    ny_buffer = np.int(xy_window[1]*(xy_overlap[1]))
    nx_windows = np.int((xspan-nx_buffer)/nx_pix_per_step) 
    ny_windows = np.int((yspan-ny_buffer)/ny_pix_per_step) 
    # Initialize a list to append window positions to
    window_list = []
    # Loop through finding x and y window positions
    # Note: you could vectorize this step, but in practice
    # you'll be considering windows one by one with your
    # classifier, so looping makes sense
    for ys in range(ny_windows):
        for xs in range(nx_windows):
            # Calculate window position
            startx = xs*nx_pix_per_step + x_start_stop[0]
            endx = startx + xy_window[0]
            starty = ys*ny_pix_per_step + y_start_stop[0]
            endy = starty + xy_window[1]
            # Append window position to list
            window_list.append(((startx, starty), (endx, endy)))
    # Return the list of windows
    return window_list

def average_slide_windows(image_shape, x_start_stop=[None, None], y_start_stop=[None, None], xy_overlap=(0.5, 0.5)):
    windows = []
    for xy in [64, 96, 140]:
#     for xy in [60,100,200]:
        window = slide_window(image_shape, x_start_stop=x_start_stop, y_start_stop=y_start_stop, 
                    xy_window=(xy, xy), xy_overlap=xy_overlap)
        windows += window
    return windows
In [23]:
image = mpimg.imread('/Users/chansek/Documents/GitHub/Self-Driving-Car/data/Dashcam/bbox-example-image.jpg')
draw_image = np.copy(image)

# Uncomment the following line if you extracted training
# data from .png images (scaled 0 to 1 by mpimg) and the
# image you are searching is a .jpg (scaled 0 to 255)
image = image.astype(np.float32)/255

# Min and max in y to search in slide_window()
y_start_stop = (450,720)
xy_overlap = (0.8,0.8)
In [24]:
f, axf = plt.subplots(1,2,figsize=(20, 10))

all_windows = []
window_img = np.copy(image)

axf[0].imshow(window_img)

for i in range(1):#len(y_start_stop)):
#     windows = slide_window(image, x_start_stop=[None, None], y_start_stop=y_start_stop[i], 
#                         xy_window=xy_window[i], xy_overlap=xy_overlap[i])
    windows = average_slide_windows(image.shape, x_start_stop=[None, None], y_start_stop=y_start_stop,
                                    xy_overlap=xy_overlap)
    all_windows += windows

window_img = draw_boxes(window_img, windows, color=(0,255,0), thick=6)

axf[1].imshow(window_img)

axf[0].set_xticks([])
axf[0].set_yticks([])            
axf[0].set_title("Test Image")

axf[1].set_xticks([])
axf[1].set_yticks([])            
axf[1].set_title("Sliding Windows")
Out[24]:
<matplotlib.text.Text at 0x123d51278>

Step 5b: Search windows with the trained classifier

Each window in the above plot is then searched using the classifier trained in Step-4. The classifier is probably going to give some false positives. To eliminate false positives, we get the heatmap from the classification and apply thresholding to the heatmap. The thresholded image is then labeled to identify the different cars in the entire image.

In [25]:
# Define a function you will pass an image 
# and the list of windows to be searched (output of slide_windows())
def search_windows(img, windows, clf, scaler, color_space='RGB', 
                    spatial_size=(32, 32), hist_bins=32, 
                    hist_range=(0, 256), orient=9, 
                    pix_per_cell=8, cell_per_block=2, 
                    hog_channel=0, spatial_feat=True, 
                    hist_feat=True, hog_feat=True):

    #1) Create an empty list to receive positive detection windows
    on_windows = []
    #2) Iterate over all windows in the list
    for window in windows:
        #3) Extract the test window from original image
        test_img = cv2.resize(img[window[0][1]:window[1][1], window[0][0]:window[1][0]], (64, 64))      
        #4) Extract features for that window using single_img_features()
        features = single_img_features(test_img, color_space=color_space, 
                            spatial_size=spatial_size, hist_bins=hist_bins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat)
        #5) Scale extracted features to be fed to classifier
        test_features = scaler.transform(np.array(features).reshape(1, -1))
        #6) Predict using your classifier
        prediction = clf.predict(test_features)
        #7) If positive (prediction == 1) then save the window
        if prediction == 1:
            on_windows.append(window)
    #8) Return windows for positive detections
    return on_windows

def add_heat(heatmap, bbox_list):
    # Iterate through list of bboxes
    for box in bbox_list:
        # Add += 1 for all pixels inside each bbox
        # Assuming each "box" takes the form ((x1, y1), (x2, y2))
        heatmap[box[0][1]:box[1][1], box[0][0]:box[1][0]] += 1

    # Return updated heatmap
    return heatmap

def apply_threshold(heatmap, threshold):
    heatmap_thresh = np.copy(heatmap)
    # Zero out pixels below the threshold
    heatmap_thresh[heatmap <= threshold] = 0
    # Return thresholded map
    return heatmap_thresh

def draw_labeled_bboxes(img, labels):
    # Iterate through all detected cars
    for car_number in range(1, labels[1]+1):
        # Find pixels with each car_number label value
        nonzero = (labels[0] == car_number).nonzero()
        # Identify x and y values of those pixels
        nonzeroy = np.array(nonzero[0])
        nonzerox = np.array(nonzero[1])
        # Define a bounding box based on min/max x and y
        bbox = ((np.min(nonzerox), np.min(nonzeroy)), (np.max(nonzerox), np.max(nonzeroy)))
        # Draw the box on the image
        cv2.rectangle(img, bbox[0], bbox[1], (0, 25, 255), 6)
    # Return the image
    return img
In [26]:
hot_windows = search_windows(image, all_windows, svc, X_scaler, color_space=cspace, 
                        spatial_size=spatial_size, hist_bins=nbins, 
                        orient=orient, pix_per_cell=pix_per_cell, 
                        cell_per_block=cell_per_block, 
                        hog_channel=hog_channel, spatial_feat=spatial_feat, 
                        hist_feat=hist_feat, hog_feat=hog_feat)                       

window_img = draw_boxes(image, hot_windows, color=(0, 0, 255), thick=2)                    

heatmap = np.zeros_like(window_img[:,:,0]).astype(np.int)#float)

heatmap = add_heat(heatmap, hot_windows)
heatmap_thresh = apply_threshold(heatmap, 1)
heatmap_thresh = np.clip(heatmap_thresh, 0, 255)
f, axf = plt.subplots(2,2,figsize=(20, 10))
axf[0,0].imshow(image)
axf[0,1].imshow(window_img)
axf[1,0].imshow(heatmap, cmap = 'hot')
axf[1,1].imshow(heatmap_thresh, cmap = 'hot')

axf[0,0].set_xticks([])
axf[0,0].set_yticks([])            
axf[0,0].set_title("Test Image")

axf[0,1].set_xticks([])
axf[0,1].set_yticks([])            
axf[0,1].set_title("Windowed Map")

axf[1,0].set_xticks([])
axf[1,0].set_yticks([])            
axf[1,0].set_title("Heat Map")

axf[1,1].set_xticks([])
axf[1,1].set_yticks([])            
axf[1,1].set_title("Thresholded Heat Map")
Out[26]:
<matplotlib.text.Text at 0x123ee0358>

The thresholded heat map is then labeled and plotted. Notice there are still 2 false positives, one next to the closest car on the right and the other being a road sign. These false positives can be eliminated through filtering by averaging over previous frames in a video.

In [27]:
from scipy.ndimage.measurements import label
labels = label(heatmap_thresh)
draw_image = np.copy(image)
applied_image = draw_labeled_bboxes(draw_image, labels)

f, axf = plt.subplots(1,2,figsize=(20, 10))
axf[0].imshow(image)
axf[1].imshow(applied_image)

axf[0].set_xticks([])
axf[0].set_yticks([])            
axf[0].set_title("Test Image")

axf[1].set_xticks([])
axf[1].set_yticks([])            
axf[1].set_title("Windowed Map")
Out[27]:
<matplotlib.text.Text at 0x1235b6a58>

Step-6: Experiment on Test Images

Now that we have trial-and-tested the parameters for the vehicle detection algorithm, it is time to test the algorithm on test images.

In [28]:
y_start_stop = (250,650)
xy_overlap = (0.8,0.8)
heat_threshold = 2

windows = average_slide_windows(image.shape, x_start_stop=[None, None],
                                y_start_stop=y_start_stop,xy_overlap=xy_overlap)

glob_test_images = glob.glob('./test_images/*.jpg')
f, ax = plt.subplots(len(glob_test_images), 4, figsize=(20,30))
imgNum = 0

for file in glob_test_images:
    image = mpimg.imread(file)
    # Uncomment the following line if you extracted training
    # data from .png images (scaled 0 to 1 by mpimg) and the
    # image you are searching is a .jpg (scaled 0 to 255)
    image = image.astype(np.float32)/255.0
    draw_image = np.copy(image)

    hot_windows = search_windows(image, windows, svc, X_scaler, color_space=cspace, 
                            spatial_size=spatial_size, hist_bins=nbins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat)    

    window_img = draw_boxes(draw_image, hot_windows, color=(0, 0, 255), thick=6)
    heat = np.zeros_like(window_img[:,:,0]).astype(np.float)
    
    heatmap = add_heat(heat, hot_windows)
    heatmap_thresh = apply_threshold(heatmap, heat_threshold)

    labels = label(heatmap_thresh)
    applied_image = draw_labeled_bboxes(draw_image, labels)
    
    
    ax[imgNum,0].imshow(image)
    ax[imgNum,0].set_title('Window Image', fontsize=10)
    
    ax[imgNum,1].imshow(heatmap, cmap='hot')
    ax[imgNum,1].set_title('Heatmap Image', fontsize=10)
    
    ax[imgNum,2].imshow(heatmap_thresh, cmap='hot')
    ax[imgNum,2].set_title('Heatmap Image with {} cars found'.format(labels[1]), fontsize=10)
    
    ax[imgNum,3].imshow(applied_image)
    ax[imgNum,3].set_title('Annotated image', fontsize=10)
    
    imgNum = imgNum+1    

Step-7: Hog Subsampling

The above algorithm is slow because of sequential windowing to identify and detect vehicles at different points in the image. A faster way would be to subsample hog features. This is similar to the above technique, but much faster. Note that Steps 6 & 7 are applying different methods for the same images and the results are slightly different.

In [29]:
def find_cars(img, ystart, ystop, scale, svc, X_scaler, color_space=cspace, 
                            spatial_size=spatial_size, hist_bins=nbins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat) :
    
    draw_img = np.copy(img)     
    img = img.astype(np.float32)/255.0
    
    img_tosearch = img[ystart:ystop,:,:]
    ctrans_tosearch = change_cspace(img_tosearch,color_space)
    if scale != 1:
        imshape = ctrans_tosearch.shape
        ctrans_tosearch = cv2.resize(ctrans_tosearch, (np.int(imshape[1]/scale), np.int(imshape[0]/scale)))
 
    ch1 = ctrans_tosearch[:,:,0]
    ch2 = ctrans_tosearch[:,:,1]
    ch3 = ctrans_tosearch[:,:,2]

    # Define blocks and steps as above
    nxblocks = (ch1.shape[1] // pix_per_cell) - cell_per_block + 1
    nyblocks = (ch1.shape[0] // pix_per_cell) - cell_per_block + 1 
    nfeat_per_block = orient*cell_per_block**2
    
    # 64 was the orginal sampling rate, with 8 cells and 8 pix per cell
    window = 64
    nblocks_per_window = (window // pix_per_cell) - cell_per_block + 1
    cells_per_step = 2  # Instead of overlap, define how many cells to step
    nxsteps = (nxblocks - nblocks_per_window) // cells_per_step
    nysteps = (nyblocks - nblocks_per_window) // cells_per_step
    
    # Compute individual channel HOG features for the entire image
    hog1 = get_hog_features(ctrans_tosearch, hog_channel = 0, orient = 9, pix_per_cell = 8, cell_per_block = 2,
                     vis=False, feature_vec=False)
    hog2 = get_hog_features(ctrans_tosearch, hog_channel = 0, orient = 9, pix_per_cell = 8, cell_per_block = 2,
                     vis=False, feature_vec=False)
    hog3 = get_hog_features(ctrans_tosearch, hog_channel = 0, orient = 9, pix_per_cell = 8, cell_per_block = 2,
                     vis=False, feature_vec=False)
    hot_windows = []
    for xb in range(nxsteps):
        for yb in range(nysteps):
            ypos = yb*cells_per_step
            xpos = xb*cells_per_step
            # Extract HOG for this patch
            hog_feat1 = hog1[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_feat2 = hog2[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_feat3 = hog3[ypos:ypos+nblocks_per_window, xpos:xpos+nblocks_per_window].ravel() 
            hog_features = np.hstack((hog_feat1, hog_feat2, hog_feat3))

            xleft = xpos*pix_per_cell
            ytop = ypos*pix_per_cell

            # Extract the image patch
            subimg = cv2.resize(ctrans_tosearch[ytop:ytop+window, xleft:xleft+window], (64,64))
          
            # Get color features
            spatial_features = bin_spatial(subimg, size=spatial_size)
            hist_features = color_hist(subimg, nbins=hist_bins)

            # Scale features and make a prediction
            test_features = X_scaler.transform(np.hstack((spatial_features, hist_features, hog_features)).reshape(1, -1))    

            len1 = 0
            len2 = len(spatial_features)
            len3 = len(hist_features)
            len4 = len(spatial_features) + len(hist_features)

            test_prediction = svc.predict(test_features)
            
            if test_prediction == 1:
                xbox_left = np.int(xleft*scale)
                ytop_draw = np.int(ytop*scale)
                win_draw = np.int(window*scale)
                hot_windows.append(((xbox_left, ytop_draw+ystart),(xbox_left+win_draw,ytop_draw+win_draw+ystart)))
                
    return hot_windows
In [92]:
y_start_stop = (350,650)
heat_threshold = 1
scale = 2.0#1.75

glob_test_images = glob.glob('./test_images/*.jpg')
f, ax = plt.subplots(len(glob_test_images), 4, figsize=(20,30))
imgNum = 0

window_img = []
heatmap = []
heatmap_thresh = []
applied_image

for file in glob_test_images:
    image = mpimg.imread(file)
    draw_image = np.copy(image)    

    hot_windows = find_cars(image, y_start_stop[0], y_start_stop[1],scale,
                           svc, X_scaler, color_space=cspace, 
                            spatial_size=spatial_size, hist_bins=nbins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat) 
    
    window_img = draw_boxes(draw_image, hot_windows, color=(0, 0, 255), thick=6)
    heat = np.zeros_like(window_img[:,:,0]).astype(np.float)
    
    heatmap = add_heat(heat, hot_windows)
    heatmap_thresh = apply_threshold(heatmap, heat_threshold)

    labels = label(heatmap_thresh)
    applied_image = draw_labeled_bboxes(draw_image, labels)
    
    
    ax[imgNum,0].imshow(image)
    ax[imgNum,0].set_title('Window Image', fontsize=10)
    
    ax[imgNum,1].imshow(heatmap, cmap='hot')
    ax[imgNum,1].set_title('Heatmap Image', fontsize=10)
    
    ax[imgNum,2].imshow(heatmap_thresh, cmap='hot')
    ax[imgNum,2].set_title('Heatmap Image with {} cars found'.format(labels[1]), fontsize=10)
    
    ax[imgNum,3].imshow(applied_image)
    ax[imgNum,3].set_title('Annotated image', fontsize=10)
    
    imgNum = imgNum+1   

Step 8: Vehicle Detection Pipeline

Now that we have the algorithm and its parameters tuned, we are ready to write the pipeline. In the pipeline, I have included some filtering and averaging to weed out the false positives more effectively.

In [116]:
from collections import deque
heat_prev = deque(maxlen = 1)

def vehicle_detection_pipeline(image):
    draw_image = np.copy(image)

    y_start_stop = (300,650)#(300,650)
    heat_threshold = 2#3#2.5
    scale = 2.0#1.75#0.95#1.75
    
    hot_windows = find_cars(image, y_start_stop[0], y_start_stop[1],scale,
                           svc, X_scaler, color_space=cspace, 
                            spatial_size=spatial_size, hist_bins=nbins, 
                            orient=orient, pix_per_cell=pix_per_cell, 
                            cell_per_block=cell_per_block, 
                            hog_channel=hog_channel, spatial_feat=spatial_feat, 
                            hist_feat=hist_feat, hog_feat=hog_feat) 
    
    window_img = draw_boxes(draw_image, hot_windows, color=(0, 0, 255), thick=6)
    heat = np.zeros_like(window_img[:,:,0]).astype(np.float)
    heatmap = add_heat(heat, hot_windows)
    
    total_heat = sum(heat_prev)/(max(len(heat_prev),1)+0.0)
    total_heatmap_thresh = apply_threshold(total_heat, heat_threshold)
    heatmap_thresh = apply_threshold(heatmap, heat_threshold)    
    
    total_thresh = (heatmap_thresh + total_heatmap_thresh)*0.5
    heatmap_thresh = apply_threshold(total_thresh, heat_threshold)
    
    heat_prev.append(heatmap)
    labels = label(heatmap_thresh)
#     print(np.unique(labels))
    final_img = draw_labeled_bboxes(draw_image, labels)

    return final_img
In [118]:
t=time.time()
f, ax = plt.subplots(len(glob_test_images), 1, figsize=(20,30))
for i in range(len(glob_test_images)):
    heat_prev = deque(maxlen = 1)
    image = mpimg.imread(glob_test_images[i])
    final_img = vehicle_detection_pipeline(image)
    ax[i].imshow(final_img)
In [119]:
heat_prev = None
heat_prev = deque(maxlen = 10)
print(heat_prev)
challenge_output = 'test_video_output.mp4'
clip2 = VideoFileClip('test_video.mp4')
challenge_clip = clip2.fl_image(vehicle_detection_pipeline)
%time challenge_clip.write_videofile(challenge_output, audio=False)
deque([], maxlen=10)
[MoviePy] >>>> Building video test_video_output.mp4
[MoviePy] Writing video test_video_output.mp4
  0%|          | 0/39 [00:00<?, ?it/s]
  3%|▎         | 1/39 [00:01<00:47,  1.26s/it]
  5%|▌         | 2/39 [00:02<00:46,  1.26s/it]
  8%|▊         | 3/39 [00:03<00:45,  1.25s/it]
 10%|█         | 4/39 [00:04<00:43,  1.25s/it]
 13%|█▎        | 5/39 [00:06<00:42,  1.25s/it]
 15%|█▌        | 6/39 [00:07<00:41,  1.26s/it]
 18%|█▊        | 7/39 [00:08<00:41,  1.30s/it]
 21%|██        | 8/39 [00:10<00:39,  1.28s/it]
 23%|██▎       | 9/39 [00:11<00:38,  1.27s/it]
 26%|██▌       | 10/39 [00:12<00:38,  1.32s/it]
 28%|██▊       | 11/39 [00:14<00:42,  1.50s/it]
 31%|███       | 12/39 [00:16<00:39,  1.47s/it]
 33%|███▎      | 13/39 [00:17<00:37,  1.45s/it]
 36%|███▌      | 14/39 [00:18<00:35,  1.42s/it]
 38%|███▊      | 15/39 [00:20<00:34,  1.44s/it]
 41%|████      | 16/39 [00:21<00:32,  1.41s/it]
 44%|████▎     | 17/39 [00:23<00:30,  1.39s/it]
 46%|████▌     | 18/39 [00:24<00:29,  1.41s/it]
 49%|████▊     | 19/39 [00:26<00:30,  1.51s/it]
 51%|█████▏    | 20/39 [00:27<00:28,  1.50s/it]
 54%|█████▍    | 21/39 [00:29<00:26,  1.47s/it]
 56%|█████▋    | 22/39 [00:30<00:24,  1.42s/it]
 59%|█████▉    | 23/39 [00:31<00:21,  1.37s/it]
 62%|██████▏   | 24/39 [00:33<00:20,  1.37s/it]
 64%|██████▍   | 25/39 [00:34<00:19,  1.38s/it]
 67%|██████▋   | 26/39 [00:35<00:17,  1.36s/it]
 69%|██████▉   | 27/39 [00:37<00:16,  1.39s/it]
 72%|███████▏  | 28/39 [00:38<00:15,  1.43s/it]
 74%|███████▍  | 29/39 [00:40<00:13,  1.39s/it]
 77%|███████▋  | 30/39 [00:41<00:12,  1.36s/it]
 79%|███████▉  | 31/39 [00:42<00:11,  1.38s/it]
 82%|████████▏ | 32/39 [00:44<00:09,  1.40s/it]
 85%|████████▍ | 33/39 [00:45<00:08,  1.42s/it]
 87%|████████▋ | 34/39 [00:47<00:06,  1.39s/it]
 90%|████████▉ | 35/39 [00:48<00:05,  1.35s/it]
 92%|█████████▏| 36/39 [00:49<00:04,  1.33s/it]
 95%|█████████▍| 37/39 [00:50<00:02,  1.31s/it]
 97%|█████████▋| 38/39 [00:52<00:01,  1.30s/it]
[MoviePy] Done.
[MoviePy] >>>> Video ready: test_video_output.mp4 

CPU times: user 49.2 s, sys: 2.62 s, total: 51.8 s
Wall time: 53.6 s

Test on the project video

In [122]:
heat_prev = None
heat_prev = deque(maxlen = 10)
print(heat_prev)
project_output = 'project_video_output.mp4'
clip2 = VideoFileClip('project_video.mp4')#.subclip(0, 10)
challenge_clip = clip2.fl_image(vehicle_detection_pipeline)
%time challenge_clip.write_videofile(project_output, audio=False)
deque([], maxlen=10)
[MoviePy] >>>> Building video project_video_output.mp4
[MoviePy] Writing video project_video_output.mp4
  0%|          | 0/1261 [00:00<?, ?it/s]
  0%|          | 1/1261 [00:01<26:36,  1.27s/it]
  0%|          | 2/1261 [00:02<26:31,  1.26s/it]
  0%|          | 3/1261 [00:03<26:18,  1.26s/it]
  0%|          | 4/1261 [00:04<26:10,  1.25s/it]
  0%|          | 5/1261 [00:06<26:01,  1.24s/it]
  0%|          | 6/1261 [00:07<26:15,  1.26s/it]
  1%|          | 7/1261 [00:08<26:16,  1.26s/it]
  1%|          | 8/1261 [00:10<26:31,  1.27s/it]
  1%|          | 9/1261 [00:11<26:25,  1.27s/it]
  1%|          | 10/1261 [00:12<26:11,  1.26s/it]
  1%|          | 11/1261 [00:13<26:02,  1.25s/it]
  1%|          | 12/1261 [00:15<26:44,  1.28s/it]
  1%|          | 13/1261 [00:16<26:23,  1.27s/it]
  1%|          | 14/1261 [00:17<26:37,  1.28s/it]
  1%|          | 15/1261 [00:18<26:36,  1.28s/it]
  1%|▏         | 16/1261 [00:20<26:17,  1.27s/it]
  1%|▏         | 17/1261 [00:21<26:11,  1.26s/it]
  1%|▏         | 18/1261 [00:22<25:58,  1.25s/it]
  2%|▏         | 19/1261 [00:23<26:07,  1.26s/it]
  2%|▏         | 20/1261 [00:25<26:06,  1.26s/it]
  2%|▏         | 21/1261 [00:26<26:05,  1.26s/it]
  2%|▏         | 22/1261 [00:27<25:56,  1.26s/it]
  2%|▏         | 23/1261 [00:28<25:51,  1.25s/it]
  2%|▏         | 24/1261 [00:30<25:52,  1.26s/it]
  2%|▏         | 25/1261 [00:31<25:49,  1.25s/it]
  2%|▏         | 26/1261 [00:32<25:47,  1.25s/it]
  2%|▏         | 27/1261 [00:34<26:05,  1.27s/it]
  2%|▏         | 28/1261 [00:35<25:57,  1.26s/it]
  2%|▏         | 29/1261 [00:36<25:52,  1.26s/it]
  2%|▏         | 30/1261 [00:37<25:56,  1.26s/it]
  2%|▏         | 31/1261 [00:39<25:43,  1.25s/it]
  3%|▎         | 32/1261 [00:40<25:41,  1.25s/it]
  3%|▎         | 33/1261 [00:41<25:45,  1.26s/it]
  3%|▎         | 34/1261 [00:42<25:39,  1.25s/it]
  3%|▎         | 35/1261 [00:44<25:40,  1.26s/it]
  3%|▎         | 36/1261 [00:45<25:43,  1.26s/it]
  3%|▎         | 37/1261 [00:46<25:37,  1.26s/it]
  3%|▎         | 38/1261 [00:47<25:51,  1.27s/it]
  3%|▎         | 39/1261 [00:49<25:59,  1.28s/it]
  3%|▎         | 40/1261 [00:50<25:49,  1.27s/it]
  3%|▎         | 41/1261 [00:51<25:47,  1.27s/it]
  3%|▎         | 42/1261 [00:52<25:31,  1.26s/it]
  3%|▎         | 43/1261 [00:54<25:35,  1.26s/it]
  3%|▎         | 44/1261 [00:55<25:37,  1.26s/it]
  4%|▎         | 45/1261 [00:56<25:31,  1.26s/it]
  4%|▎         | 46/1261 [00:57<25:19,  1.25s/it]
  4%|▎         | 47/1261 [00:59<25:28,  1.26s/it]
  4%|▍         | 48/1261 [01:00<25:37,  1.27s/it]
  4%|▍         | 49/1261 [01:01<25:32,  1.26s/it]
  4%|▍         | 50/1261 [01:03<25:28,  1.26s/it]
  4%|▍         | 51/1261 [01:04<25:39,  1.27s/it]
  4%|▍         | 52/1261 [01:05<25:37,  1.27s/it]
  4%|▍         | 53/1261 [01:06<25:32,  1.27s/it]
  4%|▍         | 54/1261 [01:08<25:32,  1.27s/it]
  4%|▍         | 55/1261 [01:09<25:38,  1.28s/it]
  4%|▍         | 56/1261 [01:10<25:38,  1.28s/it]
  5%|▍         | 57/1261 [01:11<25:36,  1.28s/it]
  5%|▍         | 58/1261 [01:13<25:27,  1.27s/it]
  5%|▍         | 59/1261 [01:14<25:42,  1.28s/it]
  5%|▍         | 60/1261 [01:15<25:41,  1.28s/it]
  5%|▍         | 61/1261 [01:17<25:50,  1.29s/it]
  5%|▍         | 62/1261 [01:18<26:00,  1.30s/it]
  5%|▍         | 63/1261 [01:19<26:03,  1.30s/it]
  5%|▌         | 64/1261 [01:21<25:37,  1.28s/it]
  5%|▌         | 65/1261 [01:22<25:31,  1.28s/it]
  5%|▌         | 66/1261 [01:23<25:24,  1.28s/it]
  5%|▌         | 67/1261 [01:24<25:19,  1.27s/it]
  5%|▌         | 68/1261 [01:26<25:11,  1.27s/it]
  5%|▌         | 69/1261 [01:27<25:03,  1.26s/it]
  6%|▌         | 70/1261 [01:28<25:08,  1.27s/it]
  6%|▌         | 71/1261 [01:29<25:08,  1.27s/it]
  6%|▌         | 72/1261 [01:31<25:11,  1.27s/it]
  6%|▌         | 73/1261 [01:32<25:21,  1.28s/it]
  6%|▌         | 74/1261 [01:33<25:30,  1.29s/it]
  6%|▌         | 75/1261 [01:35<25:13,  1.28s/it]
  6%|▌         | 76/1261 [01:36<25:00,  1.27s/it]
  6%|▌         | 77/1261 [01:37<24:58,  1.27s/it]
  6%|▌         | 78/1261 [01:38<25:11,  1.28s/it]
  6%|▋         | 79/1261 [01:40<25:00,  1.27s/it]
  6%|▋         | 80/1261 [01:41<24:50,  1.26s/it]
  6%|▋         | 81/1261 [01:42<24:53,  1.27s/it]
  7%|▋         | 82/1261 [01:43<24:52,  1.27s/it]
  7%|▋         | 83/1261 [01:45<24:54,  1.27s/it]
  7%|▋         | 84/1261 [01:46<24:56,  1.27s/it]
  7%|▋         | 85/1261 [01:47<24:52,  1.27s/it]
  7%|▋         | 86/1261 [01:48<24:58,  1.28s/it]
  7%|▋         | 87/1261 [01:50<24:55,  1.27s/it]
  7%|▋         | 88/1261 [01:51<24:47,  1.27s/it]
  7%|▋         | 89/1261 [01:52<24:48,  1.27s/it]
  7%|▋         | 90/1261 [01:54<24:41,  1.26s/it]
  7%|▋         | 91/1261 [01:55<25:02,  1.28s/it]
  7%|▋         | 92/1261 [01:56<25:00,  1.28s/it]
  7%|▋         | 93/1261 [01:57<24:39,  1.27s/it]
  7%|▋         | 94/1261 [01:59<24:37,  1.27s/it]
  8%|▊         | 95/1261 [02:00<25:12,  1.30s/it]
  8%|▊         | 96/1261 [02:01<25:05,  1.29s/it]
  8%|▊         | 97/1261 [02:03<24:49,  1.28s/it]
  8%|▊         | 98/1261 [02:04<24:50,  1.28s/it]
  8%|▊         | 99/1261 [02:05<24:43,  1.28s/it]
  8%|▊         | 100/1261 [02:06<24:46,  1.28s/it]
  8%|▊         | 101/1261 [02:08<24:54,  1.29s/it]
  8%|▊         | 102/1261 [02:09<24:36,  1.27s/it]
  8%|▊         | 103/1261 [02:10<24:45,  1.28s/it]
  8%|▊         | 104/1261 [02:11<24:32,  1.27s/it]
  8%|▊         | 105/1261 [02:13<24:40,  1.28s/it]
  8%|▊         | 106/1261 [02:14<25:11,  1.31s/it]
  8%|▊         | 107/1261 [02:15<25:18,  1.32s/it]
  9%|▊         | 108/1261 [02:17<25:16,  1.32s/it]
  9%|▊         | 109/1261 [02:18<25:14,  1.32s/it]
  9%|▊         | 110/1261 [02:19<24:45,  1.29s/it]
  9%|▉         | 111/1261 [02:21<24:23,  1.27s/it]
  9%|▉         | 112/1261 [02:22<24:25,  1.28s/it]
  9%|▉         | 113/1261 [02:23<24:23,  1.27s/it]
  9%|▉         | 114/1261 [02:24<24:20,  1.27s/it]
  9%|▉         | 115/1261 [02:26<24:28,  1.28s/it]
  9%|▉         | 116/1261 [02:27<24:36,  1.29s/it]
  9%|▉         | 117/1261 [02:28<24:19,  1.28s/it]
  9%|▉         | 118/1261 [02:29<24:06,  1.27s/it]
  9%|▉         | 119/1261 [02:31<24:19,  1.28s/it]
 10%|▉         | 120/1261 [02:32<24:11,  1.27s/it]
 10%|▉         | 121/1261 [02:33<24:02,  1.27s/it]
 10%|▉         | 122/1261 [02:35<23:53,  1.26s/it]
 10%|▉         | 123/1261 [02:36<23:51,  1.26s/it]
 10%|▉         | 124/1261 [02:37<23:40,  1.25s/it]
 10%|▉         | 125/1261 [02:38<23:53,  1.26s/it]
 10%|▉         | 126/1261 [02:40<24:00,  1.27s/it]
 10%|█         | 127/1261 [02:41<23:48,  1.26s/it]
 10%|█         | 128/1261 [02:42<23:41,  1.25s/it]
 10%|█         | 129/1261 [02:43<23:32,  1.25s/it]
 10%|█         | 130/1261 [02:45<23:41,  1.26s/it]
 10%|█         | 131/1261 [02:46<23:53,  1.27s/it]
 10%|█         | 132/1261 [02:47<23:52,  1.27s/it]
 11%|█         | 133/1261 [02:48<23:44,  1.26s/it]
 11%|█         | 134/1261 [02:50<23:46,  1.27s/it]
 11%|█         | 135/1261 [02:51<23:38,  1.26s/it]
 11%|█         | 136/1261 [02:52<23:32,  1.26s/it]
 11%|█         | 137/1261 [02:53<23:35,  1.26s/it]
 11%|█         | 138/1261 [02:55<23:25,  1.25s/it]
 11%|█         | 139/1261 [02:56<23:31,  1.26s/it]
 11%|█         | 140/1261 [02:57<23:22,  1.25s/it]
 11%|█         | 141/1261 [02:58<23:36,  1.26s/it]
 11%|█▏        | 142/1261 [03:00<23:27,  1.26s/it]
 11%|█▏        | 143/1261 [03:01<23:32,  1.26s/it]
 11%|█▏        | 144/1261 [03:02<23:22,  1.26s/it]
 11%|█▏        | 145/1261 [03:03<23:15,  1.25s/it]
 12%|█▏        | 146/1261 [03:05<23:12,  1.25s/it]
 12%|█▏        | 147/1261 [03:06<23:05,  1.24s/it]
 12%|█▏        | 148/1261 [03:07<23:08,  1.25s/it]
 12%|█▏        | 149/1261 [03:08<23:01,  1.24s/it]
 12%|█▏        | 150/1261 [03:10<23:18,  1.26s/it]
 12%|█▏        | 151/1261 [03:11<23:20,  1.26s/it]
 12%|█▏        | 152/1261 [03:12<23:32,  1.27s/it]
 12%|█▏        | 153/1261 [03:14<23:25,  1.27s/it]
 12%|█▏        | 154/1261 [03:15<23:08,  1.25s/it]
 12%|█▏        | 155/1261 [03:16<22:58,  1.25s/it]
 12%|█▏        | 156/1261 [03:17<22:48,  1.24s/it]
 12%|█▏        | 157/1261 [03:18<22:41,  1.23s/it]
 13%|█▎        | 158/1261 [03:20<23:03,  1.25s/it]
 13%|█▎        | 159/1261 [03:21<22:59,  1.25s/it]
 13%|█▎        | 160/1261 [03:22<22:49,  1.24s/it]
 13%|█▎        | 161/1261 [03:23<22:43,  1.24s/it]
 13%|█▎        | 162/1261 [03:25<22:47,  1.24s/it]
 13%|█▎        | 163/1261 [03:26<22:43,  1.24s/it]
 13%|█▎        | 164/1261 [03:27<22:44,  1.24s/it]
 13%|█▎        | 165/1261 [03:28<22:37,  1.24s/it]
 13%|█▎        | 166/1261 [03:30<22:40,  1.24s/it]
 13%|█▎        | 167/1261 [03:31<22:35,  1.24s/it]
 13%|█▎        | 168/1261 [03:32<22:28,  1.23s/it]
 13%|█▎        | 169/1261 [03:33<22:35,  1.24s/it]
 13%|█▎        | 170/1261 [03:35<22:29,  1.24s/it]
 14%|█▎        | 171/1261 [03:36<22:29,  1.24s/it]
 14%|█▎        | 172/1261 [03:37<22:50,  1.26s/it]
 14%|█▎        | 173/1261 [03:38<22:43,  1.25s/it]
 14%|█▍        | 174/1261 [03:40<22:42,  1.25s/it]
 14%|█▍        | 175/1261 [03:41<22:51,  1.26s/it]
 14%|█▍        | 176/1261 [03:42<22:40,  1.25s/it]
 14%|█▍        | 177/1261 [03:43<22:34,  1.25s/it]
 14%|█▍        | 178/1261 [03:45<22:32,  1.25s/it]
 14%|█▍        | 179/1261 [03:46<22:51,  1.27s/it]
 14%|█▍        | 180/1261 [03:47<22:44,  1.26s/it]
 14%|█▍        | 181/1261 [03:48<22:41,  1.26s/it]
 14%|█▍        | 182/1261 [03:50<22:49,  1.27s/it]
 15%|█▍        | 183/1261 [03:51<22:41,  1.26s/it]
 15%|█▍        | 184/1261 [03:52<22:47,  1.27s/it]
 15%|█▍        | 185/1261 [03:54<22:35,  1.26s/it]
 15%|█▍        | 186/1261 [03:55<22:26,  1.25s/it]
 15%|█▍        | 187/1261 [03:56<22:35,  1.26s/it]
 15%|█▍        | 188/1261 [03:57<22:46,  1.27s/it]
 15%|█▍        | 189/1261 [03:59<23:05,  1.29s/it]
 15%|█▌        | 190/1261 [04:00<22:56,  1.28s/it]
 15%|█▌        | 191/1261 [04:01<22:43,  1.27s/it]
 15%|█▌        | 192/1261 [04:02<22:19,  1.25s/it]
 15%|█▌        | 193/1261 [04:04<22:17,  1.25s/it]
 15%|█▌        | 194/1261 [04:05<22:19,  1.26s/it]
 15%|█▌        | 195/1261 [04:06<22:05,  1.24s/it]
 16%|█▌        | 196/1261 [04:07<22:03,  1.24s/it]
 16%|█▌        | 197/1261 [04:09<21:49,  1.23s/it]
 16%|█▌        | 198/1261 [04:10<21:38,  1.22s/it]
 16%|█▌        | 199/1261 [04:11<21:28,  1.21s/it]
 16%|█▌        | 200/1261 [04:12<21:46,  1.23s/it]
 16%|█▌        | 201/1261 [04:14<21:48,  1.23s/it]
 16%|█▌        | 202/1261 [04:15<22:06,  1.25s/it]
 16%|█▌        | 203/1261 [04:16<22:08,  1.26s/it]
 16%|█▌        | 204/1261 [04:17<21:56,  1.25s/it]
 16%|█▋        | 205/1261 [04:19<21:44,  1.24s/it]
 16%|█▋        | 206/1261 [04:20<21:32,  1.23s/it]
 16%|█▋        | 207/1261 [04:21<21:32,  1.23s/it]
 16%|█▋        | 208/1261 [04:22<21:29,  1.22s/it]
 17%|█▋        | 209/1261 [04:23<21:41,  1.24s/it]
 17%|█▋        | 210/1261 [04:25<21:57,  1.25s/it]
 17%|█▋        | 211/1261 [04:26<22:05,  1.26s/it]
 17%|█▋        | 212/1261 [04:27<21:45,  1.24s/it]
 17%|█▋        | 213/1261 [04:28<21:41,  1.24s/it]
 17%|█▋        | 214/1261 [04:30<21:33,  1.24s/it]
 17%|█▋        | 215/1261 [04:31<21:25,  1.23s/it]
 17%|█▋        | 216/1261 [04:32<21:29,  1.23s/it]
 17%|█▋        | 217/1261 [04:33<21:36,  1.24s/it]
 17%|█▋        | 218/1261 [04:35<21:24,  1.23s/it]
 17%|█▋        | 219/1261 [04:36<21:28,  1.24s/it]
 17%|█▋        | 220/1261 [04:37<21:14,  1.22s/it]
 18%|█▊        | 221/1261 [04:38<21:06,  1.22s/it]
 18%|█▊        | 222/1261 [04:39<21:02,  1.22s/it]
 18%|█▊        | 223/1261 [04:41<21:00,  1.21s/it]
 18%|█▊        | 224/1261 [04:42<20:56,  1.21s/it]
 18%|█▊        | 225/1261 [04:43<20:54,  1.21s/it]
 18%|█▊        | 226/1261 [04:44<20:57,  1.22s/it]
 18%|█▊        | 227/1261 [04:46<21:15,  1.23s/it]
 18%|█▊        | 228/1261 [04:47<21:26,  1.25s/it]
 18%|█▊        | 229/1261 [04:48<21:30,  1.25s/it]
 18%|█▊        | 230/1261 [04:49<21:27,  1.25s/it]
 18%|█▊        | 231/1261 [04:51<21:34,  1.26s/it]
 18%|█▊        | 232/1261 [04:52<21:21,  1.25s/it]
 18%|█▊        | 233/1261 [04:53<21:12,  1.24s/it]
 19%|█▊        | 234/1261 [04:54<21:18,  1.25s/it]
 19%|█▊        | 235/1261 [04:56<21:11,  1.24s/it]
 19%|█▊        | 236/1261 [04:57<20:59,  1.23s/it]
 19%|█▉        | 237/1261 [04:58<20:52,  1.22s/it]
 19%|█▉        | 238/1261 [04:59<20:50,  1.22s/it]
 19%|█▉        | 239/1261 [05:00<20:43,  1.22s/it]
 19%|█▉        | 240/1261 [05:02<20:39,  1.21s/it]
 19%|█▉        | 241/1261 [05:03<20:41,  1.22s/it]
 19%|█▉        | 242/1261 [05:04<20:56,  1.23s/it]
 19%|█▉        | 243/1261 [05:05<21:06,  1.24s/it]
 19%|█▉        | 244/1261 [05:07<21:15,  1.25s/it]
 19%|█▉        | 245/1261 [05:08<21:01,  1.24s/it]
 20%|█▉        | 246/1261 [05:09<21:03,  1.25s/it]
 20%|█▉        | 247/1261 [05:10<20:50,  1.23s/it]
 20%|█▉        | 248/1261 [05:12<20:57,  1.24s/it]
 20%|█▉        | 249/1261 [05:13<20:56,  1.24s/it]
 20%|█▉        | 250/1261 [05:14<20:56,  1.24s/it]
 20%|█▉        | 251/1261 [05:15<20:46,  1.23s/it]
 20%|█▉        | 252/1261 [05:16<20:43,  1.23s/it]
 20%|██        | 253/1261 [05:18<20:34,  1.22s/it]
 20%|██        | 254/1261 [05:19<20:34,  1.23s/it]
 20%|██        | 255/1261 [05:20<20:27,  1.22s/it]
 20%|██        | 256/1261 [05:21<20:36,  1.23s/it]
 20%|██        | 257/1261 [05:23<20:29,  1.22s/it]
 20%|██        | 258/1261 [05:24<20:23,  1.22s/it]
 21%|██        | 259/1261 [05:25<20:20,  1.22s/it]
 21%|██        | 260/1261 [05:26<20:38,  1.24s/it]
 21%|██        | 261/1261 [05:28<20:50,  1.25s/it]
 21%|██        | 262/1261 [05:29<20:38,  1.24s/it]
 21%|██        | 263/1261 [05:30<20:30,  1.23s/it]
 21%|██        | 264/1261 [05:31<20:47,  1.25s/it]
 21%|██        | 265/1261 [05:33<20:36,  1.24s/it]
 21%|██        | 266/1261 [05:34<20:47,  1.25s/it]
 21%|██        | 267/1261 [05:35<20:47,  1.25s/it]
 21%|██▏       | 268/1261 [05:36<20:35,  1.24s/it]
 21%|██▏       | 269/1261 [05:38<20:37,  1.25s/it]
 21%|██▏       | 270/1261 [05:39<20:27,  1.24s/it]
 21%|██▏       | 271/1261 [05:40<20:21,  1.23s/it]
 22%|██▏       | 272/1261 [05:41<20:16,  1.23s/it]
 22%|██▏       | 273/1261 [05:42<20:10,  1.23s/it]
 22%|██▏       | 274/1261 [05:44<20:06,  1.22s/it]
 22%|██▏       | 275/1261 [05:45<20:19,  1.24s/it]
 22%|██▏       | 276/1261 [05:46<20:13,  1.23s/it]
 22%|██▏       | 277/1261 [05:47<20:14,  1.23s/it]
 22%|██▏       | 278/1261 [05:49<20:03,  1.22s/it]
 22%|██▏       | 279/1261 [05:50<20:04,  1.23s/it]
 22%|██▏       | 280/1261 [05:51<20:19,  1.24s/it]
 22%|██▏       | 281/1261 [05:52<20:10,  1.23s/it]
 22%|██▏       | 282/1261 [05:54<20:17,  1.24s/it]
 22%|██▏       | 283/1261 [05:55<20:26,  1.25s/it]
 23%|██▎       | 284/1261 [05:56<20:10,  1.24s/it]
 23%|██▎       | 285/1261 [05:57<20:06,  1.24s/it]
 23%|██▎       | 286/1261 [05:58<19:54,  1.23s/it]
 23%|██▎       | 287/1261 [06:00<20:06,  1.24s/it]
 23%|██▎       | 288/1261 [06:01<20:07,  1.24s/it]
 23%|██▎       | 289/1261 [06:02<20:04,  1.24s/it]
 23%|██▎       | 290/1261 [06:03<19:54,  1.23s/it]
 23%|██▎       | 291/1261 [06:05<19:56,  1.23s/it]
 23%|██▎       | 292/1261 [06:06<19:51,  1.23s/it]
 23%|██▎       | 293/1261 [06:07<20:04,  1.24s/it]
 23%|██▎       | 294/1261 [06:08<20:02,  1.24s/it]
 23%|██▎       | 295/1261 [06:10<19:56,  1.24s/it]
 23%|██▎       | 296/1261 [06:11<19:48,  1.23s/it]
 24%|██▎       | 297/1261 [06:12<19:38,  1.22s/it]
 24%|██▎       | 298/1261 [06:13<19:44,  1.23s/it]
 24%|██▎       | 299/1261 [06:15<20:04,  1.25s/it]
 24%|██▍       | 300/1261 [06:16<19:58,  1.25s/it]
 24%|██▍       | 301/1261 [06:17<19:59,  1.25s/it]
 24%|██▍       | 302/1261 [06:18<19:54,  1.25s/it]
 24%|██▍       | 303/1261 [06:20<19:46,  1.24s/it]
 24%|██▍       | 304/1261 [06:21<19:40,  1.23s/it]
 24%|██▍       | 305/1261 [06:22<19:35,  1.23s/it]
 24%|██▍       | 306/1261 [06:23<19:37,  1.23s/it]
 24%|██▍       | 307/1261 [06:24<19:41,  1.24s/it]
 24%|██▍       | 308/1261 [06:26<19:53,  1.25s/it]
 25%|██▍       | 309/1261 [06:27<19:40,  1.24s/it]
 25%|██▍       | 310/1261 [06:28<19:31,  1.23s/it]
 25%|██▍       | 311/1261 [06:29<19:35,  1.24s/it]
 25%|██▍       | 312/1261 [06:31<19:39,  1.24s/it]
 25%|██▍       | 313/1261 [06:32<19:49,  1.25s/it]
 25%|██▍       | 314/1261 [06:33<19:33,  1.24s/it]
 25%|██▍       | 315/1261 [06:34<19:22,  1.23s/it]
 25%|██▌       | 316/1261 [06:36<19:26,  1.23s/it]
 25%|██▌       | 317/1261 [06:37<19:21,  1.23s/it]
 25%|██▌       | 318/1261 [06:38<19:16,  1.23s/it]
 25%|██▌       | 319/1261 [06:39<19:19,  1.23s/it]
 25%|██▌       | 320/1261 [06:41<19:35,  1.25s/it]
 25%|██▌       | 321/1261 [06:42<19:21,  1.24s/it]
 26%|██▌       | 322/1261 [06:43<19:17,  1.23s/it]
 26%|██▌       | 323/1261 [06:44<19:08,  1.22s/it]
 26%|██▌       | 324/1261 [06:45<19:05,  1.22s/it]
 26%|██▌       | 325/1261 [06:47<19:18,  1.24s/it]
 26%|██▌       | 326/1261 [06:48<19:10,  1.23s/it]
 26%|██▌       | 327/1261 [06:49<18:57,  1.22s/it]
 26%|██▌       | 328/1261 [06:50<18:54,  1.22s/it]
 26%|██▌       | 329/1261 [06:52<19:03,  1.23s/it]
 26%|██▌       | 330/1261 [06:53<19:11,  1.24s/it]
 26%|██▌       | 331/1261 [06:54<19:07,  1.23s/it]
 26%|██▋       | 332/1261 [06:55<19:04,  1.23s/it]
 26%|██▋       | 333/1261 [06:57<18:54,  1.22s/it]
 26%|██▋       | 334/1261 [06:58<18:46,  1.22s/it]
 27%|██▋       | 335/1261 [06:59<18:37,  1.21s/it]
 27%|██▋       | 336/1261 [07:00<18:37,  1.21s/it]
 27%|██▋       | 337/1261 [07:01<18:44,  1.22s/it]
 27%|██▋       | 338/1261 [07:03<18:39,  1.21s/it]
 27%|██▋       | 339/1261 [07:04<18:38,  1.21s/it]
 27%|██▋       | 340/1261 [07:05<18:36,  1.21s/it]
 27%|██▋       | 341/1261 [07:06<18:58,  1.24s/it]
 27%|██▋       | 342/1261 [07:08<19:01,  1.24s/it]
 27%|██▋       | 343/1261 [07:09<19:07,  1.25s/it]
 27%|██▋       | 344/1261 [07:10<19:05,  1.25s/it]
 27%|██▋       | 345/1261 [07:11<19:00,  1.25s/it]
 27%|██▋       | 346/1261 [07:12<18:48,  1.23s/it]
 28%|██▊       | 347/1261 [07:14<19:28,  1.28s/it]
 28%|██▊       | 348/1261 [07:15<19:13,  1.26s/it]
 28%|██▊       | 349/1261 [07:16<19:15,  1.27s/it]
 28%|██▊       | 350/1261 [07:18<19:14,  1.27s/it]
 28%|██▊       | 351/1261 [07:19<19:05,  1.26s/it]
 28%|██▊       | 352/1261 [07:20<18:59,  1.25s/it]
 28%|██▊       | 353/1261 [07:21<18:47,  1.24s/it]
 28%|██▊       | 354/1261 [07:23<18:38,  1.23s/it]
 28%|██▊       | 355/1261 [07:24<18:35,  1.23s/it]
 28%|██▊       | 356/1261 [07:25<18:34,  1.23s/it]
 28%|██▊       | 357/1261 [07:26<18:29,  1.23s/it]
 28%|██▊       | 358/1261 [07:27<18:25,  1.22s/it]
 28%|██▊       | 359/1261 [07:29<18:35,  1.24s/it]
 29%|██▊       | 360/1261 [07:30<18:33,  1.24s/it]
 29%|██▊       | 361/1261 [07:31<18:30,  1.23s/it]
 29%|██▊       | 362/1261 [07:32<18:22,  1.23s/it]
 29%|██▉       | 363/1261 [07:34<18:22,  1.23s/it]
 29%|██▉       | 364/1261 [07:35<18:26,  1.23s/it]
 29%|██▉       | 365/1261 [07:36<18:28,  1.24s/it]
 29%|██▉       | 366/1261 [07:37<18:30,  1.24s/it]
 29%|██▉       | 367/1261 [07:39<18:19,  1.23s/it]
 29%|██▉       | 368/1261 [07:40<18:26,  1.24s/it]
 29%|██▉       | 369/1261 [07:41<18:34,  1.25s/it]
 29%|██▉       | 370/1261 [07:42<18:37,  1.25s/it]
 29%|██▉       | 371/1261 [07:44<18:41,  1.26s/it]
 30%|██▉       | 372/1261 [07:45<18:41,  1.26s/it]
 30%|██▉       | 373/1261 [07:46<18:31,  1.25s/it]
 30%|██▉       | 374/1261 [07:47<18:24,  1.24s/it]
 30%|██▉       | 375/1261 [07:49<18:29,  1.25s/it]
 30%|██▉       | 376/1261 [07:50<18:15,  1.24s/it]
 30%|██▉       | 377/1261 [07:51<18:25,  1.25s/it]
 30%|██▉       | 378/1261 [07:52<18:18,  1.24s/it]
 30%|███       | 379/1261 [07:54<18:08,  1.23s/it]
 30%|███       | 380/1261 [07:55<18:13,  1.24s/it]
 30%|███       | 381/1261 [07:56<18:04,  1.23s/it]
 30%|███       | 382/1261 [07:57<17:58,  1.23s/it]
 30%|███       | 383/1261 [07:58<17:52,  1.22s/it]
 30%|███       | 384/1261 [08:00<18:05,  1.24s/it]
 31%|███       | 385/1261 [08:01<17:57,  1.23s/it]
 31%|███       | 386/1261 [08:02<17:55,  1.23s/it]
 31%|███       | 387/1261 [08:03<18:02,  1.24s/it]
 31%|███       | 388/1261 [08:05<18:09,  1.25s/it]
 31%|███       | 389/1261 [08:06<18:07,  1.25s/it]
 31%|███       | 390/1261 [08:07<17:59,  1.24s/it]
 31%|███       | 391/1261 [08:08<17:58,  1.24s/it]
 31%|███       | 392/1261 [08:10<17:47,  1.23s/it]
 31%|███       | 393/1261 [08:11<17:59,  1.24s/it]
 31%|███       | 394/1261 [08:12<17:48,  1.23s/it]
 31%|███▏      | 395/1261 [08:13<17:48,  1.23s/it]
 31%|███▏      | 396/1261 [08:15<18:05,  1.25s/it]
 31%|███▏      | 397/1261 [08:16<17:57,  1.25s/it]
 32%|███▏      | 398/1261 [08:17<17:58,  1.25s/it]
 32%|███▏      | 399/1261 [08:18<17:47,  1.24s/it]
 32%|███▏      | 400/1261 [08:20<17:37,  1.23s/it]
 32%|███▏      | 401/1261 [08:21<17:31,  1.22s/it]
 32%|███▏      | 402/1261 [08:22<17:25,  1.22s/it]
 32%|███▏      | 403/1261 [08:23<17:21,  1.21s/it]
 32%|███▏      | 404/1261 [08:24<17:22,  1.22s/it]
 32%|███▏      | 405/1261 [08:26<17:21,  1.22s/it]
 32%|███▏      | 406/1261 [08:27<17:23,  1.22s/it]
 32%|███▏      | 407/1261 [08:28<17:33,  1.23s/it]
 32%|███▏      | 408/1261 [08:29<17:25,  1.23s/it]
 32%|███▏      | 409/1261 [08:31<17:31,  1.23s/it]
 33%|███▎      | 410/1261 [08:32<17:39,  1.24s/it]
 33%|███▎      | 411/1261 [08:33<17:28,  1.23s/it]
 33%|███▎      | 412/1261 [08:34<17:35,  1.24s/it]
 33%|███▎      | 413/1261 [08:36<17:28,  1.24s/it]
 33%|███▎      | 414/1261 [08:37<17:26,  1.24s/it]
 33%|███▎      | 415/1261 [08:38<17:14,  1.22s/it]
 33%|███▎      | 416/1261 [08:39<17:06,  1.21s/it]
 33%|███▎      | 417/1261 [08:40<17:06,  1.22s/it]
 33%|███▎      | 418/1261 [08:42<17:18,  1.23s/it]
 33%|███▎      | 419/1261 [08:43<17:10,  1.22s/it]
 33%|███▎      | 420/1261 [08:44<17:05,  1.22s/it]
 33%|███▎      | 421/1261 [08:45<17:04,  1.22s/it]
 33%|███▎      | 422/1261 [08:46<17:00,  1.22s/it]
 34%|███▎      | 423/1261 [08:48<16:59,  1.22s/it]
 34%|███▎      | 424/1261 [08:49<17:00,  1.22s/it]
 34%|███▎      | 425/1261 [08:50<16:59,  1.22s/it]
 34%|███▍      | 426/1261 [08:51<17:00,  1.22s/it]
 34%|███▍      | 427/1261 [08:53<17:08,  1.23s/it]
 34%|███▍      | 428/1261 [08:54<16:56,  1.22s/it]
 34%|███▍      | 429/1261 [08:55<17:05,  1.23s/it]
 34%|███▍      | 430/1261 [08:56<16:54,  1.22s/it]
 34%|███▍      | 431/1261 [08:57<16:50,  1.22s/it]
 34%|███▍      | 432/1261 [08:59<16:45,  1.21s/it]
 34%|███▍      | 433/1261 [09:00<16:44,  1.21s/it]
 34%|███▍      | 434/1261 [09:01<16:43,  1.21s/it]
 34%|███▍      | 435/1261 [09:02<16:39,  1.21s/it]
 35%|███▍      | 436/1261 [09:04<16:42,  1.21s/it]
 35%|███▍      | 437/1261 [09:05<16:53,  1.23s/it]
 35%|███▍      | 438/1261 [09:06<17:02,  1.24s/it]
 35%|███▍      | 439/1261 [09:07<16:55,  1.24s/it]
 35%|███▍      | 440/1261 [09:09<16:57,  1.24s/it]
 35%|███▍      | 441/1261 [09:10<16:46,  1.23s/it]
 35%|███▌      | 442/1261 [09:11<16:42,  1.22s/it]
 35%|███▌      | 443/1261 [09:12<16:35,  1.22s/it]
 35%|███▌      | 444/1261 [09:13<16:35,  1.22s/it]
 35%|███▌      | 445/1261 [09:15<16:51,  1.24s/it]
 35%|███▌      | 446/1261 [09:16<16:40,  1.23s/it]
 35%|███▌      | 447/1261 [09:17<16:40,  1.23s/it]
 36%|███▌      | 448/1261 [09:18<16:30,  1.22s/it]
 36%|███▌      | 449/1261 [09:20<16:36,  1.23s/it]
 36%|███▌      | 450/1261 [09:21<16:28,  1.22s/it]
 36%|███▌      | 451/1261 [09:22<16:23,  1.21s/it]
 36%|███▌      | 452/1261 [09:23<16:18,  1.21s/it]
 36%|███▌      | 453/1261 [09:24<16:18,  1.21s/it]
 36%|███▌      | 454/1261 [09:26<16:21,  1.22s/it]
 36%|███▌      | 455/1261 [09:27<16:20,  1.22s/it]
 36%|███▌      | 456/1261 [09:28<16:34,  1.23s/it]
 36%|███▌      | 457/1261 [09:29<16:31,  1.23s/it]
 36%|███▋      | 458/1261 [09:31<16:27,  1.23s/it]
 36%|███▋      | 459/1261 [09:32<16:35,  1.24s/it]
 36%|███▋      | 460/1261 [09:33<16:37,  1.25s/it]
 37%|███▋      | 461/1261 [09:34<16:42,  1.25s/it]
 37%|███▋      | 462/1261 [09:36<16:33,  1.24s/it]
 37%|███▋      | 463/1261 [09:37<16:30,  1.24s/it]
 37%|███▋      | 464/1261 [09:38<16:35,  1.25s/it]
 37%|███▋      | 465/1261 [09:39<16:39,  1.26s/it]
 37%|███▋      | 466/1261 [09:41<16:25,  1.24s/it]
 37%|███▋      | 467/1261 [09:42<16:23,  1.24s/it]
 37%|███▋      | 468/1261 [09:43<16:16,  1.23s/it]
 37%|███▋      | 469/1261 [09:44<16:08,  1.22s/it]
 37%|███▋      | 470/1261 [09:45<16:03,  1.22s/it]
 37%|███▋      | 471/1261 [09:47<16:06,  1.22s/it]
 37%|███▋      | 472/1261 [09:48<16:03,  1.22s/it]
 38%|███▊      | 473/1261 [09:49<16:05,  1.23s/it]
 38%|███▊      | 474/1261 [09:50<16:15,  1.24s/it]
 38%|███▊      | 475/1261 [09:52<16:16,  1.24s/it]
 38%|███▊      | 476/1261 [09:53<16:21,  1.25s/it]
 38%|███▊      | 477/1261 [09:54<16:09,  1.24s/it]
 38%|███▊      | 478/1261 [09:55<16:14,  1.24s/it]
 38%|███▊      | 479/1261 [09:57<16:14,  1.25s/it]
 38%|███▊      | 480/1261 [09:58<16:08,  1.24s/it]
 38%|███▊      | 481/1261 [09:59<15:57,  1.23s/it]
 38%|███▊      | 482/1261 [10:00<16:07,  1.24s/it]
 38%|███▊      | 483/1261 [10:02<16:11,  1.25s/it]
 38%|███▊      | 484/1261 [10:03<16:03,  1.24s/it]
 38%|███▊      | 485/1261 [10:04<15:59,  1.24s/it]
 39%|███▊      | 486/1261 [10:05<15:52,  1.23s/it]
 39%|███▊      | 487/1261 [10:06<15:54,  1.23s/it]
 39%|███▊      | 488/1261 [10:08<15:56,  1.24s/it]
 39%|███▉      | 489/1261 [10:09<15:51,  1.23s/it]
 39%|███▉      | 490/1261 [10:10<15:47,  1.23s/it]
 39%|███▉      | 491/1261 [10:11<15:49,  1.23s/it]
 39%|███▉      | 492/1261 [10:13<15:52,  1.24s/it]
 39%|███▉      | 493/1261 [10:14<15:53,  1.24s/it]
 39%|███▉      | 494/1261 [10:15<16:07,  1.26s/it]
 39%|███▉      | 495/1261 [10:16<15:57,  1.25s/it]
 39%|███▉      | 496/1261 [10:18<15:52,  1.24s/it]
 39%|███▉      | 497/1261 [10:19<15:55,  1.25s/it]
 39%|███▉      | 498/1261 [10:20<15:49,  1.24s/it]
 40%|███▉      | 499/1261 [10:21<15:53,  1.25s/it]
 40%|███▉      | 500/1261 [10:23<15:54,  1.25s/it]
 40%|███▉      | 501/1261 [10:24<15:52,  1.25s/it]
 40%|███▉      | 502/1261 [10:25<15:44,  1.25s/it]
 40%|███▉      | 503/1261 [10:26<15:34,  1.23s/it]
 40%|███▉      | 504/1261 [10:28<15:32,  1.23s/it]
 40%|████      | 505/1261 [10:29<15:26,  1.23s/it]
 40%|████      | 506/1261 [10:30<15:23,  1.22s/it]
 40%|████      | 507/1261 [10:31<15:23,  1.23s/it]
 40%|████      | 508/1261 [10:32<15:22,  1.22s/it]
 40%|████      | 509/1261 [10:34<15:16,  1.22s/it]
 40%|████      | 510/1261 [10:35<15:26,  1.23s/it]
 41%|████      | 511/1261 [10:36<15:25,  1.23s/it]
 41%|████      | 512/1261 [10:37<15:17,  1.23s/it]
 41%|████      | 513/1261 [10:39<15:14,  1.22s/it]
 41%|████      | 514/1261 [10:40<15:24,  1.24s/it]
 41%|████      | 515/1261 [10:41<15:24,  1.24s/it]
 41%|████      | 516/1261 [10:42<15:20,  1.24s/it]
 41%|████      | 517/1261 [10:44<15:11,  1.22s/it]
 41%|████      | 518/1261 [10:45<15:15,  1.23s/it]
 41%|████      | 519/1261 [10:46<15:21,  1.24s/it]
 41%|████      | 520/1261 [10:47<15:26,  1.25s/it]
 41%|████▏     | 521/1261 [10:49<15:14,  1.24s/it]
 41%|████▏     | 522/1261 [10:50<15:17,  1.24s/it]
 41%|████▏     | 523/1261 [10:51<15:10,  1.23s/it]
 42%|████▏     | 524/1261 [10:52<15:00,  1.22s/it]
 42%|████▏     | 525/1261 [10:53<15:06,  1.23s/it]
 42%|████▏     | 526/1261 [10:55<15:18,  1.25s/it]
 42%|████▏     | 527/1261 [10:56<15:10,  1.24s/it]
 42%|████▏     | 528/1261 [10:57<15:04,  1.23s/it]
 42%|████▏     | 529/1261 [10:58<15:04,  1.24s/it]
 42%|████▏     | 530/1261 [11:00<14:54,  1.22s/it]
 42%|████▏     | 531/1261 [11:01<14:53,  1.22s/it]
 42%|████▏     | 532/1261 [11:02<14:46,  1.22s/it]
 42%|████▏     | 533/1261 [11:03<14:54,  1.23s/it]
 42%|████▏     | 534/1261 [11:05<14:54,  1.23s/it]
 42%|████▏     | 535/1261 [11:06<14:53,  1.23s/it]
 43%|████▎     | 536/1261 [11:07<14:54,  1.23s/it]
 43%|████▎     | 537/1261 [11:08<14:48,  1.23s/it]
 43%|████▎     | 538/1261 [11:09<14:47,  1.23s/it]
 43%|████▎     | 539/1261 [11:11<14:48,  1.23s/it]
 43%|████▎     | 540/1261 [11:12<14:38,  1.22s/it]
 43%|████▎     | 541/1261 [11:13<14:37,  1.22s/it]
 43%|████▎     | 542/1261 [11:14<14:33,  1.22s/it]
 43%|████▎     | 543/1261 [11:15<14:29,  1.21s/it]
 43%|████▎     | 544/1261 [11:17<14:37,  1.22s/it]
 43%|████▎     | 545/1261 [11:18<14:30,  1.22s/it]
 43%|████▎     | 546/1261 [11:19<14:31,  1.22s/it]
 43%|████▎     | 547/1261 [11:20<14:27,  1.22s/it]
 43%|████▎     | 548/1261 [11:22<14:35,  1.23s/it]
 44%|████▎     | 549/1261 [11:23<14:42,  1.24s/it]
 44%|████▎     | 550/1261 [11:24<14:35,  1.23s/it]
 44%|████▎     | 551/1261 [11:25<14:42,  1.24s/it]
 44%|████▍     | 552/1261 [11:27<14:31,  1.23s/it]
 44%|████▍     | 553/1261 [11:28<14:32,  1.23s/it]
 44%|████▍     | 554/1261 [11:29<14:23,  1.22s/it]
 44%|████▍     | 555/1261 [11:30<14:17,  1.22s/it]
 44%|████▍     | 556/1261 [11:31<14:12,  1.21s/it]
 44%|████▍     | 557/1261 [11:33<14:13,  1.21s/it]
 44%|████▍     | 558/1261 [11:34<14:13,  1.21s/it]
 44%|████▍     | 559/1261 [11:35<14:11,  1.21s/it]
 44%|████▍     | 560/1261 [11:36<14:08,  1.21s/it]
 44%|████▍     | 561/1261 [11:37<14:07,  1.21s/it]
 45%|████▍     | 562/1261 [11:39<14:21,  1.23s/it]
 45%|████▍     | 563/1261 [11:40<14:13,  1.22s/it]
 45%|████▍     | 564/1261 [11:41<14:08,  1.22s/it]
 45%|████▍     | 565/1261 [11:42<14:03,  1.21s/it]
 45%|████▍     | 566/1261 [11:44<14:08,  1.22s/it]
 45%|████▍     | 567/1261 [11:45<14:09,  1.22s/it]
 45%|████▌     | 568/1261 [11:46<14:15,  1.23s/it]
 45%|████▌     | 569/1261 [11:47<14:21,  1.24s/it]
 45%|████▌     | 570/1261 [11:49<14:11,  1.23s/it]
 45%|████▌     | 571/1261 [11:50<14:02,  1.22s/it]
 45%|████▌     | 572/1261 [11:51<13:58,  1.22s/it]
 45%|████▌     | 573/1261 [11:52<13:58,  1.22s/it]
 46%|████▌     | 574/1261 [11:53<13:52,  1.21s/it]
 46%|████▌     | 575/1261 [11:55<13:48,  1.21s/it]
 46%|████▌     | 576/1261 [11:56<13:49,  1.21s/it]
 46%|████▌     | 577/1261 [11:57<13:48,  1.21s/it]
 46%|████▌     | 578/1261 [11:58<13:46,  1.21s/it]
 46%|████▌     | 579/1261 [11:59<13:50,  1.22s/it]
 46%|████▌     | 580/1261 [12:01<13:47,  1.22s/it]
 46%|████▌     | 581/1261 [12:02<13:58,  1.23s/it]
 46%|████▌     | 582/1261 [12:03<13:53,  1.23s/it]
 46%|████▌     | 583/1261 [12:04<13:47,  1.22s/it]
 46%|████▋     | 584/1261 [12:06<13:46,  1.22s/it]
 46%|████▋     | 585/1261 [12:07<13:56,  1.24s/it]
 46%|████▋     | 586/1261 [12:08<13:54,  1.24s/it]
 47%|████▋     | 587/1261 [12:09<13:57,  1.24s/it]
 47%|████▋     | 588/1261 [12:11<13:49,  1.23s/it]
 47%|████▋     | 589/1261 [12:12<14:02,  1.25s/it]
 47%|████▋     | 590/1261 [12:13<14:31,  1.30s/it]
 47%|████▋     | 591/1261 [12:15<15:34,  1.40s/it]
 47%|████▋     | 592/1261 [12:16<16:04,  1.44s/it]
 47%|████▋     | 593/1261 [12:18<16:13,  1.46s/it]
 47%|████▋     | 594/1261 [12:20<16:49,  1.51s/it]
 47%|████▋     | 595/1261 [12:21<17:07,  1.54s/it]
 47%|████▋     | 596/1261 [12:23<17:09,  1.55s/it]
 47%|████▋     | 597/1261 [12:24<16:52,  1.53s/it]
 47%|████▋     | 598/1261 [12:25<16:04,  1.45s/it]
 48%|████▊     | 599/1261 [12:27<15:45,  1.43s/it]
 48%|████▊     | 600/1261 [12:28<15:16,  1.39s/it]
 48%|████▊     | 601/1261 [12:29<14:51,  1.35s/it]
 48%|████▊     | 602/1261 [12:31<14:36,  1.33s/it]
 48%|████▊     | 603/1261 [12:32<14:23,  1.31s/it]
 48%|████▊     | 604/1261 [12:33<14:12,  1.30s/it]
 48%|████▊     | 605/1261 [12:34<14:01,  1.28s/it]
 48%|████▊     | 606/1261 [12:36<13:54,  1.27s/it]
 48%|████▊     | 607/1261 [12:37<13:55,  1.28s/it]
 48%|████▊     | 608/1261 [12:38<13:52,  1.28s/it]
 48%|████▊     | 609/1261 [12:40<13:52,  1.28s/it]
 48%|████▊     | 610/1261 [12:41<13:46,  1.27s/it]
 48%|████▊     | 611/1261 [12:42<13:37,  1.26s/it]
 49%|████▊     | 612/1261 [12:43<13:34,  1.25s/it]
 49%|████▊     | 613/1261 [12:45<13:32,  1.25s/it]
 49%|████▊     | 614/1261 [12:46<13:32,  1.26s/it]
 49%|████▉     | 615/1261 [12:47<13:29,  1.25s/it]
 49%|████▉     | 616/1261 [12:48<13:34,  1.26s/it]
 49%|████▉     | 617/1261 [12:50<13:27,  1.25s/it]
 49%|████▉     | 618/1261 [12:51<13:22,  1.25s/it]
 49%|████▉     | 619/1261 [12:52<13:17,  1.24s/it]
 49%|████▉     | 620/1261 [12:53<13:16,  1.24s/it]
 49%|████▉     | 621/1261 [12:55<13:19,  1.25s/it]
 49%|████▉     | 622/1261 [12:56<13:21,  1.25s/it]
 49%|████▉     | 623/1261 [12:57<13:21,  1.26s/it]
 49%|████▉     | 624/1261 [12:58<13:18,  1.25s/it]
 50%|████▉     | 625/1261 [13:00<13:12,  1.25s/it]
 50%|████▉     | 626/1261 [13:01<13:08,  1.24s/it]
 50%|████▉     | 627/1261 [13:02<13:07,  1.24s/it]
 50%|████▉     | 628/1261 [13:03<13:08,  1.25s/it]
 50%|████▉     | 629/1261 [13:05<14:40,  1.39s/it]
 50%|████▉     | 630/1261 [13:06<14:18,  1.36s/it]
 50%|█████     | 631/1261 [13:08<13:53,  1.32s/it]
 50%|█████     | 632/1261 [13:09<14:04,  1.34s/it]
 50%|█████     | 633/1261 [13:10<14:30,  1.39s/it]
 50%|█████     | 634/1261 [13:12<15:04,  1.44s/it]
 50%|█████     | 635/1261 [13:14<15:22,  1.47s/it]
 50%|█████     | 636/1261 [13:15<14:48,  1.42s/it]
 51%|█████     | 637/1261 [13:16<14:25,  1.39s/it]
 51%|█████     | 638/1261 [13:17<14:00,  1.35s/it]
 51%|█████     | 639/1261 [13:19<13:45,  1.33s/it]
 51%|█████     | 640/1261 [13:20<13:28,  1.30s/it]
 51%|█████     | 641/1261 [13:21<13:20,  1.29s/it]
 51%|█████     | 642/1261 [13:22<13:10,  1.28s/it]
 51%|█████     | 643/1261 [13:24<13:14,  1.29s/it]
 51%|█████     | 644/1261 [13:25<13:16,  1.29s/it]
 51%|█████     | 645/1261 [13:26<13:06,  1.28s/it]
 51%|█████     | 646/1261 [13:28<13:04,  1.28s/it]
 51%|█████▏    | 647/1261 [13:29<12:57,  1.27s/it]
 51%|█████▏    | 648/1261 [13:30<13:01,  1.28s/it]
 51%|█████▏    | 649/1261 [13:31<12:51,  1.26s/it]
 52%|█████▏    | 650/1261 [13:33<12:50,  1.26s/it]
 52%|█████▏    | 651/1261 [13:34<12:50,  1.26s/it]
 52%|█████▏    | 652/1261 [13:35<12:55,  1.27s/it]
 52%|█████▏    | 653/1261 [13:36<12:45,  1.26s/it]
 52%|█████▏    | 654/1261 [13:38<12:44,  1.26s/it]
 52%|█████▏    | 655/1261 [13:39<12:37,  1.25s/it]
 52%|█████▏    | 656/1261 [13:40<12:34,  1.25s/it]
 52%|█████▏    | 657/1261 [13:41<12:31,  1.24s/it]
 52%|█████▏    | 658/1261 [13:43<12:34,  1.25s/it]
 52%|█████▏    | 659/1261 [13:44<12:31,  1.25s/it]
 52%|█████▏    | 660/1261 [13:45<12:29,  1.25s/it]
 52%|█████▏    | 661/1261 [13:46<12:35,  1.26s/it]
 52%|█████▏    | 662/1261 [13:48<12:36,  1.26s/it]
 53%|█████▎    | 663/1261 [13:49<12:28,  1.25s/it]
 53%|█████▎    | 664/1261 [13:50<12:25,  1.25s/it]
 53%|█████▎    | 665/1261 [13:51<12:27,  1.25s/it]
 53%|█████▎    | 666/1261 [13:53<12:34,  1.27s/it]
 53%|█████▎    | 667/1261 [13:54<12:31,  1.27s/it]
 53%|█████▎    | 668/1261 [13:55<12:32,  1.27s/it]
 53%|█████▎    | 669/1261 [13:56<12:26,  1.26s/it]
 53%|█████▎    | 670/1261 [13:58<12:24,  1.26s/it]
 53%|█████▎    | 671/1261 [13:59<12:19,  1.25s/it]
 53%|█████▎    | 672/1261 [14:00<12:19,  1.26s/it]
 53%|█████▎    | 673/1261 [14:01<12:13,  1.25s/it]
 53%|█████▎    | 674/1261 [14:03<12:12,  1.25s/it]
 54%|█████▎    | 675/1261 [14:04<12:09,  1.25s/it]
 54%|█████▎    | 676/1261 [14:05<12:06,  1.24s/it]
 54%|█████▎    | 677/1261 [14:06<12:06,  1.24s/it]
 54%|█████▍    | 678/1261 [14:08<12:09,  1.25s/it]
 54%|█████▍    | 679/1261 [14:09<12:07,  1.25s/it]
 54%|█████▍    | 680/1261 [14:10<12:04,  1.25s/it]
 54%|█████▍    | 681/1261 [14:11<12:05,  1.25s/it]
 54%|█████▍    | 682/1261 [14:13<12:07,  1.26s/it]
 54%|█████▍    | 683/1261 [14:14<12:15,  1.27s/it]
 54%|█████▍    | 684/1261 [14:15<12:31,  1.30s/it]
 54%|█████▍    | 685/1261 [14:17<12:20,  1.29s/it]
 54%|█████▍    | 686/1261 [14:18<12:20,  1.29s/it]
 54%|█████▍    | 687/1261 [14:19<12:14,  1.28s/it]
 55%|█████▍    | 688/1261 [14:20<12:05,  1.27s/it]
 55%|█████▍    | 689/1261 [14:22<11:58,  1.26s/it]
 55%|█████▍    | 690/1261 [14:23<11:57,  1.26s/it]
 55%|█████▍    | 691/1261 [14:24<11:55,  1.26s/it]
 55%|█████▍    | 692/1261 [14:25<12:03,  1.27s/it]
 55%|█████▍    | 693/1261 [14:27<11:57,  1.26s/it]
 55%|█████▌    | 694/1261 [14:28<11:48,  1.25s/it]
 55%|█████▌    | 695/1261 [14:29<11:46,  1.25s/it]
 55%|█████▌    | 696/1261 [14:30<11:48,  1.25s/it]
 55%|█████▌    | 697/1261 [14:32<11:57,  1.27s/it]
 55%|█████▌    | 698/1261 [14:33<11:54,  1.27s/it]
 55%|█████▌    | 699/1261 [14:34<11:49,  1.26s/it]
 56%|█████▌    | 700/1261 [14:36<11:47,  1.26s/it]
 56%|█████▌    | 701/1261 [14:37<11:45,  1.26s/it]
 56%|█████▌    | 702/1261 [14:38<11:43,  1.26s/it]
 56%|█████▌    | 703/1261 [14:39<11:38,  1.25s/it]
 56%|█████▌    | 704/1261 [14:41<11:34,  1.25s/it]
 56%|█████▌    | 705/1261 [14:42<11:38,  1.26s/it]
 56%|█████▌    | 706/1261 [14:43<11:45,  1.27s/it]
 56%|█████▌    | 707/1261 [14:44<11:42,  1.27s/it]
 56%|█████▌    | 708/1261 [14:46<11:42,  1.27s/it]
 56%|█████▌    | 709/1261 [14:47<11:37,  1.26s/it]
 56%|█████▋    | 710/1261 [14:48<11:31,  1.26s/it]
 56%|█████▋    | 711/1261 [14:49<11:37,  1.27s/it]
 56%|█████▋    | 712/1261 [14:51<11:33,  1.26s/it]
 57%|█████▋    | 713/1261 [14:52<11:40,  1.28s/it]
 57%|█████▋    | 714/1261 [14:53<11:35,  1.27s/it]
 57%|█████▋    | 715/1261 [14:55<11:34,  1.27s/it]
 57%|█████▋    | 716/1261 [14:56<11:29,  1.26s/it]
 57%|█████▋    | 717/1261 [14:57<11:24,  1.26s/it]
 57%|█████▋    | 718/1261 [14:58<11:20,  1.25s/it]
 57%|█████▋    | 719/1261 [14:59<11:17,  1.25s/it]
 57%|█████▋    | 720/1261 [15:01<11:17,  1.25s/it]
 57%|█████▋    | 721/1261 [15:02<11:23,  1.27s/it]
 57%|█████▋    | 722/1261 [15:03<11:21,  1.26s/it]
 57%|█████▋    | 723/1261 [15:05<11:17,  1.26s/it]
 57%|█████▋    | 724/1261 [15:06<11:18,  1.26s/it]
 57%|█████▋    | 725/1261 [15:07<11:23,  1.28s/it]
 58%|█████▊    | 726/1261 [15:08<11:25,  1.28s/it]
 58%|█████▊    | 727/1261 [15:10<11:18,  1.27s/it]
 58%|█████▊    | 728/1261 [15:11<11:14,  1.26s/it]
 58%|█████▊    | 729/1261 [15:12<11:12,  1.26s/it]
 58%|█████▊    | 730/1261 [15:13<11:13,  1.27s/it]
 58%|█████▊    | 731/1261 [15:15<11:11,  1.27s/it]
 58%|█████▊    | 732/1261 [15:16<11:09,  1.27s/it]
 58%|█████▊    | 733/1261 [15:17<11:08,  1.27s/it]
 58%|█████▊    | 734/1261 [15:19<11:04,  1.26s/it]
 58%|█████▊    | 735/1261 [15:20<11:12,  1.28s/it]
 58%|█████▊    | 736/1261 [15:21<11:08,  1.27s/it]
 58%|█████▊    | 737/1261 [15:22<11:08,  1.27s/it]
 59%|█████▊    | 738/1261 [15:24<11:15,  1.29s/it]
 59%|█████▊    | 739/1261 [15:25<11:07,  1.28s/it]
 59%|█████▊    | 740/1261 [15:26<10:55,  1.26s/it]
 59%|█████▉    | 741/1261 [15:27<10:48,  1.25s/it]
 59%|█████▉    | 742/1261 [15:29<10:45,  1.24s/it]
 59%|█████▉    | 743/1261 [15:30<10:40,  1.24s/it]
 59%|█████▉    | 744/1261 [15:31<10:42,  1.24s/it]
 59%|█████▉    | 745/1261 [15:32<10:35,  1.23s/it]
 59%|█████▉    | 746/1261 [15:34<10:32,  1.23s/it]
 59%|█████▉    | 747/1261 [15:35<10:37,  1.24s/it]
 59%|█████▉    | 748/1261 [15:36<10:39,  1.25s/it]
 59%|█████▉    | 749/1261 [15:37<10:40,  1.25s/it]
 59%|█████▉    | 750/1261 [15:39<10:36,  1.24s/it]
 60%|█████▉    | 751/1261 [15:40<10:35,  1.25s/it]
 60%|█████▉    | 752/1261 [15:41<10:28,  1.24s/it]
 60%|█████▉    | 753/1261 [15:42<10:25,  1.23s/it]
 60%|█████▉    | 754/1261 [15:43<10:23,  1.23s/it]
 60%|█████▉    | 755/1261 [15:45<10:19,  1.22s/it]
 60%|█████▉    | 756/1261 [15:46<10:25,  1.24s/it]
 60%|██████    | 757/1261 [15:47<10:20,  1.23s/it]
 60%|██████    | 758/1261 [15:48<10:15,  1.22s/it]
 60%|██████    | 759/1261 [15:50<10:13,  1.22s/it]
 60%|██████    | 760/1261 [15:51<10:13,  1.22s/it]
 60%|██████    | 761/1261 [15:52<10:17,  1.24s/it]
 60%|██████    | 762/1261 [15:53<10:18,  1.24s/it]
 61%|██████    | 763/1261 [15:55<10:14,  1.23s/it]
 61%|██████    | 764/1261 [15:56<10:15,  1.24s/it]
 61%|██████    | 765/1261 [15:57<10:17,  1.25s/it]
 61%|██████    | 766/1261 [15:58<10:08,  1.23s/it]
 61%|██████    | 767/1261 [15:59<10:06,  1.23s/it]
 61%|██████    | 768/1261 [16:01<10:02,  1.22s/it]
 61%|██████    | 769/1261 [16:02<09:58,  1.22s/it]
 61%|██████    | 770/1261 [16:03<10:03,  1.23s/it]
 61%|██████    | 771/1261 [16:04<10:08,  1.24s/it]
 61%|██████    | 772/1261 [16:06<10:04,  1.24s/it]
 61%|██████▏   | 773/1261 [16:07<10:01,  1.23s/it]
 61%|██████▏   | 774/1261 [16:08<09:56,  1.22s/it]
 61%|██████▏   | 775/1261 [16:09<10:01,  1.24s/it]
 62%|██████▏   | 776/1261 [16:11<10:04,  1.25s/it]
 62%|██████▏   | 777/1261 [16:12<09:58,  1.24s/it]
 62%|██████▏   | 778/1261 [16:13<09:55,  1.23s/it]
 62%|██████▏   | 779/1261 [16:14<10:01,  1.25s/it]
 62%|██████▏   | 780/1261 [16:16<09:58,  1.24s/it]
 62%|██████▏   | 781/1261 [16:17<09:56,  1.24s/it]
 62%|██████▏   | 782/1261 [16:18<09:49,  1.23s/it]
 62%|██████▏   | 783/1261 [16:19<09:54,  1.24s/it]
 62%|██████▏   | 784/1261 [16:21<09:55,  1.25s/it]
 62%|██████▏   | 785/1261 [16:22<09:52,  1.24s/it]
 62%|██████▏   | 786/1261 [16:23<09:57,  1.26s/it]
 62%|██████▏   | 787/1261 [16:24<09:49,  1.24s/it]
 62%|██████▏   | 788/1261 [16:25<09:43,  1.23s/it]
 63%|██████▎   | 789/1261 [16:27<09:42,  1.24s/it]
 63%|██████▎   | 790/1261 [16:28<09:41,  1.23s/it]
 63%|██████▎   | 791/1261 [16:29<09:37,  1.23s/it]
 63%|██████▎   | 792/1261 [16:30<09:35,  1.23s/it]
 63%|██████▎   | 793/1261 [16:32<09:29,  1.22s/it]
 63%|██████▎   | 794/1261 [16:33<09:31,  1.22s/it]
 63%|██████▎   | 795/1261 [16:34<09:36,  1.24s/it]
 63%|██████▎   | 796/1261 [16:35<09:33,  1.23s/it]
 63%|██████▎   | 797/1261 [16:37<09:33,  1.24s/it]
 63%|██████▎   | 798/1261 [16:38<09:26,  1.22s/it]
 63%|██████▎   | 799/1261 [16:39<09:23,  1.22s/it]
 63%|██████▎   | 800/1261 [16:40<09:21,  1.22s/it]
 64%|██████▎   | 801/1261 [16:41<09:19,  1.22s/it]
 64%|██████▎   | 802/1261 [16:43<09:20,  1.22s/it]
 64%|██████▎   | 803/1261 [16:44<09:21,  1.23s/it]
 64%|██████▍   | 804/1261 [16:45<09:27,  1.24s/it]
 64%|██████▍   | 805/1261 [16:46<09:27,  1.24s/it]
 64%|██████▍   | 806/1261 [16:48<09:21,  1.23s/it]
 64%|██████▍   | 807/1261 [16:49<09:16,  1.23s/it]
 64%|██████▍   | 808/1261 [16:50<09:22,  1.24s/it]
 64%|██████▍   | 809/1261 [16:51<09:16,  1.23s/it]
 64%|██████▍   | 810/1261 [16:52<09:15,  1.23s/it]
 64%|██████▍   | 811/1261 [16:54<09:11,  1.22s/it]
 64%|██████▍   | 812/1261 [16:55<09:11,  1.23s/it]
 64%|██████▍   | 813/1261 [16:56<09:12,  1.23s/it]
 65%|██████▍   | 814/1261 [16:57<09:08,  1.23s/it]
 65%|██████▍   | 815/1261 [16:59<09:03,  1.22s/it]
 65%|██████▍   | 816/1261 [17:00<09:08,  1.23s/it]
 65%|██████▍   | 817/1261 [17:01<09:11,  1.24s/it]
 65%|██████▍   | 818/1261 [17:02<09:18,  1.26s/it]
 65%|██████▍   | 819/1261 [17:04<09:18,  1.26s/it]
 65%|██████▌   | 820/1261 [17:05<09:27,  1.29s/it]
 65%|██████▌   | 821/1261 [17:06<09:40,  1.32s/it]
 65%|██████▌   | 822/1261 [17:08<10:25,  1.42s/it]
 65%|██████▌   | 823/1261 [17:10<10:44,  1.47s/it]
 65%|██████▌   | 824/1261 [17:11<10:56,  1.50s/it]
 65%|██████▌   | 825/1261 [17:13<10:35,  1.46s/it]
 66%|██████▌   | 826/1261 [17:14<10:25,  1.44s/it]
 66%|██████▌   | 827/1261 [17:15<10:00,  1.38s/it]
 66%|██████▌   | 828/1261 [17:17<09:41,  1.34s/it]
 66%|██████▌   | 829/1261 [17:18<09:30,  1.32s/it]
 66%|██████▌   | 830/1261 [17:19<09:20,  1.30s/it]
 66%|██████▌   | 831/1261 [17:20<09:14,  1.29s/it]
 66%|██████▌   | 832/1261 [17:22<09:10,  1.28s/it]
 66%|██████▌   | 833/1261 [17:23<09:03,  1.27s/it]
 66%|██████▌   | 834/1261 [17:24<09:03,  1.27s/it]
 66%|██████▌   | 835/1261 [17:25<09:05,  1.28s/it]
 66%|██████▋   | 836/1261 [17:27<09:05,  1.28s/it]
 66%|██████▋   | 837/1261 [17:28<09:01,  1.28s/it]
 66%|██████▋   | 838/1261 [17:29<09:00,  1.28s/it]
 67%|██████▋   | 839/1261 [17:30<08:59,  1.28s/it]
 67%|██████▋   | 840/1261 [17:32<08:57,  1.28s/it]
 67%|██████▋   | 841/1261 [17:33<08:52,  1.27s/it]
 67%|██████▋   | 842/1261 [17:34<08:57,  1.28s/it]
 67%|██████▋   | 843/1261 [17:36<08:53,  1.28s/it]
 67%|██████▋   | 844/1261 [17:37<08:47,  1.26s/it]
 67%|██████▋   | 845/1261 [17:38<08:45,  1.26s/it]
 67%|██████▋   | 846/1261 [17:39<08:47,  1.27s/it]
 67%|██████▋   | 847/1261 [17:41<08:43,  1.26s/it]
 67%|██████▋   | 848/1261 [17:42<08:44,  1.27s/it]
 67%|██████▋   | 849/1261 [17:43<08:38,  1.26s/it]
 67%|██████▋   | 850/1261 [17:44<08:39,  1.26s/it]
 67%|██████▋   | 851/1261 [17:46<08:46,  1.28s/it]
 68%|██████▊   | 852/1261 [17:47<08:39,  1.27s/it]
 68%|██████▊   | 853/1261 [17:48<08:37,  1.27s/it]
 68%|██████▊   | 854/1261 [17:49<08:31,  1.26s/it]
 68%|██████▊   | 855/1261 [17:51<08:32,  1.26s/it]
 68%|██████▊   | 856/1261 [17:52<08:38,  1.28s/it]
 68%|██████▊   | 857/1261 [17:53<08:32,  1.27s/it]
 68%|██████▊   | 858/1261 [17:55<08:46,  1.31s/it]
 68%|██████▊   | 859/1261 [17:56<09:06,  1.36s/it]
 68%|██████▊   | 860/1261 [17:57<08:52,  1.33s/it]
 68%|██████▊   | 861/1261 [17:59<08:48,  1.32s/it]
 68%|██████▊   | 862/1261 [18:00<08:38,  1.30s/it]
 68%|██████▊   | 863/1261 [18:01<08:31,  1.28s/it]
 69%|██████▊   | 864/1261 [18:03<08:28,  1.28s/it]
 69%|██████▊   | 865/1261 [18:04<08:24,  1.27s/it]
 69%|██████▊   | 866/1261 [18:05<08:23,  1.27s/it]
 69%|██████▉   | 867/1261 [18:06<08:27,  1.29s/it]
 69%|██████▉   | 868/1261 [18:08<08:20,  1.27s/it]
 69%|██████▉   | 869/1261 [18:09<08:15,  1.26s/it]
 69%|██████▉   | 870/1261 [18:10<08:16,  1.27s/it]
 69%|██████▉   | 871/1261 [18:11<08:13,  1.26s/it]
 69%|██████▉   | 872/1261 [18:13<08:11,  1.26s/it]
 69%|██████▉   | 873/1261 [18:14<08:16,  1.28s/it]
 69%|██████▉   | 874/1261 [18:15<08:27,  1.31s/it]
 69%|██████▉   | 875/1261 [18:17<08:19,  1.30s/it]
 69%|██████▉   | 876/1261 [18:18<08:21,  1.30s/it]
 70%|██████▉   | 877/1261 [18:19<08:18,  1.30s/it]
 70%|██████▉   | 878/1261 [18:20<08:13,  1.29s/it]
 70%|██████▉   | 879/1261 [18:22<08:09,  1.28s/it]
 70%|██████▉   | 880/1261 [18:23<08:04,  1.27s/it]
 70%|██████▉   | 881/1261 [18:24<08:02,  1.27s/it]
 70%|██████▉   | 882/1261 [18:26<07:59,  1.27s/it]
 70%|███████   | 883/1261 [18:27<07:58,  1.27s/it]
 70%|███████   | 884/1261 [18:28<07:56,  1.26s/it]
 70%|███████   | 885/1261 [18:29<07:53,  1.26s/it]
 70%|███████   | 886/1261 [18:31<07:52,  1.26s/it]
 70%|███████   | 887/1261 [18:32<07:51,  1.26s/it]
 70%|███████   | 888/1261 [18:33<07:53,  1.27s/it]
 70%|███████   | 889/1261 [18:34<07:55,  1.28s/it]
 71%|███████   | 890/1261 [18:36<08:06,  1.31s/it]
 71%|███████   | 891/1261 [18:37<08:22,  1.36s/it]
 71%|███████   | 892/1261 [18:39<08:51,  1.44s/it]
 71%|███████   | 893/1261 [18:40<08:35,  1.40s/it]
 71%|███████   | 894/1261 [18:42<08:21,  1.37s/it]
 71%|███████   | 895/1261 [18:43<08:16,  1.36s/it]
 71%|███████   | 896/1261 [18:44<08:08,  1.34s/it]
 71%|███████   | 897/1261 [18:45<07:57,  1.31s/it]
 71%|███████   | 898/1261 [18:47<07:49,  1.29s/it]
 71%|███████▏  | 899/1261 [18:48<07:43,  1.28s/it]
 71%|███████▏  | 900/1261 [18:49<07:37,  1.27s/it]
 71%|███████▏  | 901/1261 [18:50<07:37,  1.27s/it]
 72%|███████▏  | 902/1261 [18:52<07:34,  1.27s/it]
 72%|███████▏  | 903/1261 [18:53<07:32,  1.26s/it]
 72%|███████▏  | 904/1261 [18:54<07:30,  1.26s/it]
 72%|███████▏  | 905/1261 [18:55<07:28,  1.26s/it]
 72%|███████▏  | 906/1261 [18:57<07:25,  1.26s/it]
 72%|███████▏  | 907/1261 [18:58<07:22,  1.25s/it]
 72%|███████▏  | 908/1261 [18:59<07:24,  1.26s/it]
 72%|███████▏  | 909/1261 [19:00<07:22,  1.26s/it]
 72%|███████▏  | 910/1261 [19:02<07:20,  1.26s/it]
 72%|███████▏  | 911/1261 [19:03<07:25,  1.27s/it]
 72%|███████▏  | 912/1261 [19:04<07:29,  1.29s/it]
 72%|███████▏  | 913/1261 [19:06<07:27,  1.29s/it]
 72%|███████▏  | 914/1261 [19:07<07:24,  1.28s/it]
 73%|███████▎  | 915/1261 [19:08<07:20,  1.27s/it]
 73%|███████▎  | 916/1261 [19:09<07:20,  1.28s/it]
 73%|███████▎  | 917/1261 [19:11<07:15,  1.27s/it]
 73%|███████▎  | 918/1261 [19:12<07:15,  1.27s/it]
 73%|███████▎  | 919/1261 [19:13<07:13,  1.27s/it]
 73%|███████▎  | 920/1261 [19:14<07:13,  1.27s/it]
 73%|███████▎  | 921/1261 [19:16<07:09,  1.26s/it]
 73%|███████▎  | 922/1261 [19:17<07:12,  1.28s/it]
 73%|███████▎  | 923/1261 [19:18<07:09,  1.27s/it]
 73%|███████▎  | 924/1261 [19:20<07:12,  1.28s/it]
 73%|███████▎  | 925/1261 [19:21<07:10,  1.28s/it]
 73%|███████▎  | 926/1261 [19:22<07:08,  1.28s/it]
 74%|███████▎  | 927/1261 [19:23<07:07,  1.28s/it]
 74%|███████▎  | 928/1261 [19:25<07:04,  1.27s/it]
 74%|███████▎  | 929/1261 [19:26<06:59,  1.26s/it]
 74%|███████▍  | 930/1261 [19:27<06:58,  1.26s/it]
 74%|███████▍  | 931/1261 [19:28<06:58,  1.27s/it]
 74%|███████▍  | 932/1261 [19:30<07:03,  1.29s/it]
 74%|███████▍  | 933/1261 [19:31<06:58,  1.28s/it]
 74%|███████▍  | 934/1261 [19:32<06:59,  1.28s/it]
 74%|███████▍  | 935/1261 [19:34<06:55,  1.27s/it]
 74%|███████▍  | 936/1261 [19:35<06:53,  1.27s/it]
 74%|███████▍  | 937/1261 [19:36<06:50,  1.27s/it]
 74%|███████▍  | 938/1261 [19:37<06:53,  1.28s/it]
 74%|███████▍  | 939/1261 [19:39<06:47,  1.27s/it]
 75%|███████▍  | 940/1261 [19:40<06:45,  1.26s/it]
 75%|███████▍  | 941/1261 [19:41<06:42,  1.26s/it]
 75%|███████▍  | 942/1261 [19:42<06:42,  1.26s/it]
 75%|███████▍  | 943/1261 [19:44<06:39,  1.26s/it]
 75%|███████▍  | 944/1261 [19:45<06:38,  1.26s/it]
 75%|███████▍  | 945/1261 [19:46<06:38,  1.26s/it]
 75%|███████▌  | 946/1261 [19:47<06:37,  1.26s/it]
 75%|███████▌  | 947/1261 [19:49<06:36,  1.26s/it]
 75%|███████▌  | 948/1261 [19:50<06:35,  1.26s/it]
 75%|███████▌  | 949/1261 [19:51<06:32,  1.26s/it]
 75%|███████▌  | 950/1261 [19:53<06:32,  1.26s/it]
 75%|███████▌  | 951/1261 [19:54<06:33,  1.27s/it]
 75%|███████▌  | 952/1261 [19:55<06:32,  1.27s/it]
 76%|███████▌  | 953/1261 [19:56<06:31,  1.27s/it]
 76%|███████▌  | 954/1261 [19:58<06:29,  1.27s/it]
 76%|███████▌  | 955/1261 [19:59<06:33,  1.29s/it]
 76%|███████▌  | 956/1261 [20:00<06:29,  1.28s/it]
 76%|███████▌  | 957/1261 [20:02<06:31,  1.29s/it]
 76%|███████▌  | 958/1261 [20:03<06:25,  1.27s/it]
 76%|███████▌  | 959/1261 [20:04<06:24,  1.27s/it]
 76%|███████▌  | 960/1261 [20:05<06:22,  1.27s/it]
 76%|███████▌  | 961/1261 [20:07<06:18,  1.26s/it]
 76%|███████▋  | 962/1261 [20:08<06:16,  1.26s/it]
 76%|███████▋  | 963/1261 [20:09<06:14,  1.26s/it]
 76%|███████▋  | 964/1261 [20:10<06:11,  1.25s/it]
 77%|███████▋  | 965/1261 [20:12<06:09,  1.25s/it]
 77%|███████▋  | 966/1261 [20:13<06:08,  1.25s/it]
 77%|███████▋  | 967/1261 [20:14<06:06,  1.25s/it]
 77%|███████▋  | 968/1261 [20:15<06:16,  1.28s/it]
 77%|███████▋  | 969/1261 [20:17<06:12,  1.27s/it]
 77%|███████▋  | 970/1261 [20:18<06:13,  1.28s/it]
 77%|███████▋  | 971/1261 [20:19<06:11,  1.28s/it]
 77%|███████▋  | 972/1261 [20:21<06:10,  1.28s/it]
 77%|███████▋  | 973/1261 [20:22<06:09,  1.28s/it]
 77%|███████▋  | 974/1261 [20:23<06:03,  1.27s/it]
 77%|███████▋  | 975/1261 [20:24<06:01,  1.26s/it]
 77%|███████▋  | 976/1261 [20:26<06:01,  1.27s/it]
 77%|███████▋  | 977/1261 [20:27<05:58,  1.26s/it]
 78%|███████▊  | 978/1261 [20:28<06:01,  1.28s/it]
 78%|███████▊  | 979/1261 [20:29<05:57,  1.27s/it]
 78%|███████▊  | 980/1261 [20:31<05:55,  1.26s/it]
 78%|███████▊  | 981/1261 [20:32<05:57,  1.28s/it]
 78%|███████▊  | 982/1261 [20:33<05:55,  1.28s/it]
 78%|███████▊  | 983/1261 [20:34<05:52,  1.27s/it]
 78%|███████▊  | 984/1261 [20:36<05:52,  1.27s/it]
 78%|███████▊  | 985/1261 [20:37<05:49,  1.27s/it]
 78%|███████▊  | 986/1261 [20:38<05:45,  1.26s/it]
 78%|███████▊  | 987/1261 [20:40<05:46,  1.27s/it]
 78%|███████▊  | 988/1261 [20:41<05:50,  1.29s/it]
 78%|███████▊  | 989/1261 [20:42<05:47,  1.28s/it]
 79%|███████▊  | 990/1261 [20:43<05:45,  1.28s/it]
 79%|███████▊  | 991/1261 [20:45<05:43,  1.27s/it]
 79%|███████▊  | 992/1261 [20:46<05:39,  1.26s/it]
 79%|███████▊  | 993/1261 [20:47<05:40,  1.27s/it]
 79%|███████▉  | 994/1261 [20:48<05:39,  1.27s/it]
 79%|███████▉  | 995/1261 [20:50<05:36,  1.26s/it]
 79%|███████▉  | 996/1261 [20:51<05:41,  1.29s/it]
 79%|███████▉  | 997/1261 [20:52<05:37,  1.28s/it]
 79%|███████▉  | 998/1261 [20:54<05:33,  1.27s/it]
 79%|███████▉  | 999/1261 [20:55<05:32,  1.27s/it]
 79%|███████▉  | 1000/1261 [20:56<05:27,  1.25s/it]
 79%|███████▉  | 1001/1261 [20:57<05:22,  1.24s/it]
 79%|███████▉  | 1002/1261 [20:58<05:20,  1.24s/it]
 80%|███████▉  | 1003/1261 [21:00<05:17,  1.23s/it]
 80%|███████▉  | 1004/1261 [21:01<05:14,  1.22s/it]
 80%|███████▉  | 1005/1261 [21:02<05:12,  1.22s/it]
 80%|███████▉  | 1006/1261 [21:03<05:10,  1.22s/it]
 80%|███████▉  | 1007/1261 [21:05<05:08,  1.22s/it]
 80%|███████▉  | 1008/1261 [21:06<05:08,  1.22s/it]
 80%|████████  | 1009/1261 [21:07<05:12,  1.24s/it]
 80%|████████  | 1010/1261 [21:08<05:14,  1.25s/it]
 80%|████████  | 1011/1261 [21:10<05:11,  1.25s/it]
 80%|████████  | 1012/1261 [21:11<05:08,  1.24s/it]
 80%|████████  | 1013/1261 [21:12<05:11,  1.26s/it]
 80%|████████  | 1014/1261 [21:13<05:13,  1.27s/it]
 80%|████████  | 1015/1261 [21:15<05:07,  1.25s/it]
 81%|████████  | 1016/1261 [21:16<05:07,  1.26s/it]
 81%|████████  | 1017/1261 [21:17<05:09,  1.27s/it]
 81%|████████  | 1018/1261 [21:18<05:06,  1.26s/it]
 81%|████████  | 1019/1261 [21:20<05:05,  1.26s/it]
 81%|████████  | 1020/1261 [21:21<05:04,  1.26s/it]
 81%|████████  | 1021/1261 [21:22<05:00,  1.25s/it]
 81%|████████  | 1022/1261 [21:23<04:59,  1.25s/it]
 81%|████████  | 1023/1261 [21:25<04:58,  1.25s/it]
 81%|████████  | 1024/1261 [21:26<04:57,  1.25s/it]
 81%|████████▏ | 1025/1261 [21:27<04:57,  1.26s/it]
 81%|████████▏ | 1026/1261 [21:28<04:54,  1.25s/it]
 81%|████████▏ | 1027/1261 [21:30<04:50,  1.24s/it]
 82%|████████▏ | 1028/1261 [21:31<04:46,  1.23s/it]
 82%|████████▏ | 1029/1261 [21:32<04:47,  1.24s/it]
 82%|████████▏ | 1030/1261 [21:33<04:44,  1.23s/it]
 82%|████████▏ | 1031/1261 [21:35<04:42,  1.23s/it]
 82%|████████▏ | 1032/1261 [21:36<04:44,  1.24s/it]
 82%|████████▏ | 1033/1261 [21:37<04:45,  1.25s/it]
 82%|████████▏ | 1034/1261 [21:38<04:43,  1.25s/it]
 82%|████████▏ | 1035/1261 [21:40<04:41,  1.25s/it]
 82%|████████▏ | 1036/1261 [21:41<04:40,  1.25s/it]
 82%|████████▏ | 1037/1261 [21:42<04:37,  1.24s/it]
 82%|████████▏ | 1038/1261 [21:43<04:33,  1.23s/it]
 82%|████████▏ | 1039/1261 [21:44<04:33,  1.23s/it]
 82%|████████▏ | 1040/1261 [21:46<04:31,  1.23s/it]
 83%|████████▎ | 1041/1261 [21:47<04:29,  1.23s/it]
 83%|████████▎ | 1042/1261 [21:48<04:28,  1.22s/it]
 83%|████████▎ | 1043/1261 [21:49<04:29,  1.24s/it]
 83%|████████▎ | 1044/1261 [21:51<04:30,  1.25s/it]
 83%|████████▎ | 1045/1261 [21:52<04:28,  1.24s/it]
 83%|████████▎ | 1046/1261 [21:53<04:24,  1.23s/it]
 83%|████████▎ | 1047/1261 [21:54<04:24,  1.23s/it]
 83%|████████▎ | 1048/1261 [21:56<04:22,  1.23s/it]
 83%|████████▎ | 1049/1261 [21:57<04:21,  1.24s/it]
 83%|████████▎ | 1050/1261 [21:58<04:22,  1.25s/it]
 83%|████████▎ | 1051/1261 [21:59<04:23,  1.26s/it]
 83%|████████▎ | 1052/1261 [22:01<04:18,  1.24s/it]
 84%|████████▎ | 1053/1261 [22:02<04:21,  1.26s/it]
 84%|████████▎ | 1054/1261 [22:03<04:17,  1.24s/it]
 84%|████████▎ | 1055/1261 [22:04<04:18,  1.26s/it]
 84%|████████▎ | 1056/1261 [22:06<04:17,  1.26s/it]
 84%|████████▍ | 1057/1261 [22:07<04:15,  1.25s/it]
 84%|████████▍ | 1058/1261 [22:08<04:11,  1.24s/it]
 84%|████████▍ | 1059/1261 [22:09<04:11,  1.25s/it]
 84%|████████▍ | 1060/1261 [22:11<04:10,  1.24s/it]
 84%|████████▍ | 1061/1261 [22:12<04:06,  1.23s/it]
 84%|████████▍ | 1062/1261 [22:13<04:07,  1.24s/it]
 84%|████████▍ | 1063/1261 [22:14<04:11,  1.27s/it]
 84%|████████▍ | 1064/1261 [22:16<04:11,  1.28s/it]
 84%|████████▍ | 1065/1261 [22:17<04:10,  1.28s/it]
 85%|████████▍ | 1066/1261 [22:18<04:07,  1.27s/it]
 85%|████████▍ | 1067/1261 [22:19<04:02,  1.25s/it]
 85%|████████▍ | 1068/1261 [22:21<04:00,  1.25s/it]
 85%|████████▍ | 1069/1261 [22:22<03:57,  1.24s/it]
 85%|████████▍ | 1070/1261 [22:23<03:57,  1.24s/it]
 85%|████████▍ | 1071/1261 [22:24<03:57,  1.25s/it]
 85%|████████▌ | 1072/1261 [22:26<03:55,  1.25s/it]
 85%|████████▌ | 1073/1261 [22:27<03:52,  1.24s/it]
 85%|████████▌ | 1074/1261 [22:28<03:52,  1.24s/it]
 85%|████████▌ | 1075/1261 [22:29<03:50,  1.24s/it]
 85%|████████▌ | 1076/1261 [22:31<03:50,  1.25s/it]
 85%|████████▌ | 1077/1261 [22:32<03:50,  1.25s/it]
 85%|████████▌ | 1078/1261 [22:33<03:47,  1.24s/it]
 86%|████████▌ | 1079/1261 [22:34<03:47,  1.25s/it]
 86%|████████▌ | 1080/1261 [22:36<03:43,  1.24s/it]
 86%|████████▌ | 1081/1261 [22:37<03:54,  1.30s/it]
 86%|████████▌ | 1082/1261 [22:38<03:57,  1.33s/it]
 86%|████████▌ | 1083/1261 [22:40<04:04,  1.38s/it]
 86%|████████▌ | 1084/1261 [22:41<04:13,  1.43s/it]
 86%|████████▌ | 1085/1261 [22:43<04:25,  1.51s/it]
 86%|████████▌ | 1086/1261 [22:45<04:21,  1.50s/it]
 86%|████████▌ | 1087/1261 [22:46<04:19,  1.49s/it]
 86%|████████▋ | 1088/1261 [22:48<04:21,  1.51s/it]
 86%|████████▋ | 1089/1261 [22:49<04:20,  1.51s/it]
 86%|████████▋ | 1090/1261 [22:50<04:06,  1.44s/it]
 87%|████████▋ | 1091/1261 [22:52<03:55,  1.38s/it]
 87%|████████▋ | 1092/1261 [22:53<03:46,  1.34s/it]
 87%|████████▋ | 1093/1261 [22:54<03:41,  1.32s/it]
 87%|████████▋ | 1094/1261 [22:55<03:38,  1.31s/it]
 87%|████████▋ | 1095/1261 [22:57<03:37,  1.31s/it]
 87%|████████▋ | 1096/1261 [22:58<03:34,  1.30s/it]
 87%|████████▋ | 1097/1261 [22:59<03:31,  1.29s/it]
 87%|████████▋ | 1098/1261 [23:01<03:27,  1.27s/it]
 87%|████████▋ | 1099/1261 [23:02<03:28,  1.29s/it]
 87%|████████▋ | 1100/1261 [23:03<03:24,  1.27s/it]
 87%|████████▋ | 1101/1261 [23:04<03:24,  1.28s/it]
 87%|████████▋ | 1102/1261 [23:06<03:22,  1.27s/it]
 87%|████████▋ | 1103/1261 [23:07<03:21,  1.28s/it]
 88%|████████▊ | 1104/1261 [23:08<03:19,  1.27s/it]
 88%|████████▊ | 1105/1261 [23:09<03:18,  1.27s/it]
 88%|████████▊ | 1106/1261 [23:11<03:19,  1.29s/it]
 88%|████████▊ | 1107/1261 [23:12<03:17,  1.29s/it]
 88%|████████▊ | 1108/1261 [23:13<03:15,  1.28s/it]
 88%|████████▊ | 1109/1261 [23:15<03:12,  1.27s/it]
 88%|████████▊ | 1110/1261 [23:16<03:10,  1.26s/it]
 88%|████████▊ | 1111/1261 [23:17<03:08,  1.26s/it]
 88%|████████▊ | 1112/1261 [23:18<03:07,  1.26s/it]
 88%|████████▊ | 1113/1261 [23:20<03:05,  1.25s/it]
 88%|████████▊ | 1114/1261 [23:21<03:04,  1.25s/it]
 88%|████████▊ | 1115/1261 [23:22<03:02,  1.25s/it]
 89%|████████▊ | 1116/1261 [23:23<03:02,  1.26s/it]
 89%|████████▊ | 1117/1261 [23:25<03:03,  1.27s/it]
 89%|████████▊ | 1118/1261 [23:26<03:00,  1.26s/it]
 89%|████████▊ | 1119/1261 [23:27<03:00,  1.27s/it]
 89%|████████▉ | 1120/1261 [23:28<02:58,  1.27s/it]
 89%|████████▉ | 1121/1261 [23:30<02:56,  1.26s/it]
 89%|████████▉ | 1122/1261 [23:31<02:56,  1.27s/it]
 89%|████████▉ | 1123/1261 [23:32<02:53,  1.26s/it]
 89%|████████▉ | 1124/1261 [23:33<02:51,  1.25s/it]
 89%|████████▉ | 1125/1261 [23:35<02:50,  1.25s/it]
 89%|████████▉ | 1126/1261 [23:36<02:49,  1.26s/it]
 89%|████████▉ | 1127/1261 [23:37<02:48,  1.26s/it]
 89%|████████▉ | 1128/1261 [23:39<02:50,  1.28s/it]
 90%|████████▉ | 1129/1261 [23:40<02:47,  1.27s/it]
 90%|████████▉ | 1130/1261 [23:41<02:47,  1.28s/it]
 90%|████████▉ | 1131/1261 [23:42<02:46,  1.28s/it]
 90%|████████▉ | 1132/1261 [23:44<02:44,  1.28s/it]
 90%|████████▉ | 1133/1261 [23:45<02:41,  1.26s/it]
 90%|████████▉ | 1134/1261 [23:46<02:41,  1.27s/it]
 90%|█████████ | 1135/1261 [23:47<02:38,  1.26s/it]
 90%|█████████ | 1136/1261 [23:49<02:37,  1.26s/it]
 90%|█████████ | 1137/1261 [23:50<02:35,  1.25s/it]
 90%|█████████ | 1138/1261 [23:51<02:33,  1.25s/it]
 90%|█████████ | 1139/1261 [23:52<02:33,  1.26s/it]
 90%|█████████ | 1140/1261 [23:54<02:32,  1.26s/it]
 90%|█████████ | 1141/1261 [23:55<02:33,  1.28s/it]
 91%|█████████ | 1142/1261 [23:57<02:41,  1.36s/it]
 91%|█████████ | 1143/1261 [23:58<02:44,  1.40s/it]
 91%|█████████ | 1144/1261 [24:00<02:51,  1.47s/it]
 91%|█████████ | 1145/1261 [24:01<02:51,  1.48s/it]
 91%|█████████ | 1146/1261 [24:03<02:47,  1.46s/it]
 91%|█████████ | 1147/1261 [24:04<02:38,  1.39s/it]
 91%|█████████ | 1148/1261 [24:05<02:32,  1.35s/it]
 91%|█████████ | 1149/1261 [24:06<02:28,  1.32s/it]
 91%|█████████ | 1150/1261 [24:08<02:24,  1.30s/it]
 91%|█████████▏| 1151/1261 [24:09<02:23,  1.31s/it]
 91%|█████████▏| 1152/1261 [24:10<02:20,  1.29s/it]
 91%|█████████▏| 1153/1261 [24:11<02:18,  1.28s/it]
 92%|█████████▏| 1154/1261 [24:13<02:16,  1.28s/it]
 92%|█████████▏| 1155/1261 [24:14<02:14,  1.27s/it]
 92%|█████████▏| 1156/1261 [24:15<02:15,  1.29s/it]
 92%|█████████▏| 1157/1261 [24:17<02:13,  1.29s/it]
 92%|█████████▏| 1158/1261 [24:18<02:13,  1.30s/it]
 92%|█████████▏| 1159/1261 [24:19<02:11,  1.29s/it]
 92%|█████████▏| 1160/1261 [24:20<02:08,  1.27s/it]
 92%|█████████▏| 1161/1261 [24:22<02:07,  1.28s/it]
 92%|█████████▏| 1162/1261 [24:23<02:05,  1.27s/it]
 92%|█████████▏| 1163/1261 [24:24<02:03,  1.26s/it]
 92%|█████████▏| 1164/1261 [24:25<02:01,  1.26s/it]
 92%|█████████▏| 1165/1261 [24:27<02:01,  1.26s/it]
 92%|█████████▏| 1166/1261 [24:28<02:00,  1.27s/it]
 93%|█████████▎| 1167/1261 [24:29<01:59,  1.27s/it]
 93%|█████████▎| 1168/1261 [24:31<01:57,  1.26s/it]
 93%|█████████▎| 1169/1261 [24:32<01:56,  1.27s/it]
 93%|█████████▎| 1170/1261 [24:33<01:55,  1.27s/it]
 93%|█████████▎| 1171/1261 [24:34<01:54,  1.27s/it]
 93%|█████████▎| 1172/1261 [24:36<01:52,  1.26s/it]
 93%|█████████▎| 1173/1261 [24:37<01:50,  1.26s/it]
 93%|█████████▎| 1174/1261 [24:38<01:48,  1.25s/it]
 93%|█████████▎| 1175/1261 [24:39<01:48,  1.26s/it]
 93%|█████████▎| 1176/1261 [24:41<01:47,  1.26s/it]
 93%|█████████▎| 1177/1261 [24:42<01:45,  1.26s/it]
 93%|█████████▎| 1178/1261 [24:43<01:44,  1.26s/it]
 93%|█████████▎| 1179/1261 [24:44<01:44,  1.28s/it]
 94%|█████████▎| 1180/1261 [24:46<01:42,  1.27s/it]
 94%|█████████▎| 1181/1261 [24:47<01:40,  1.26s/it]
 94%|█████████▎| 1182/1261 [24:48<01:39,  1.25s/it]
 94%|█████████▍| 1183/1261 [24:49<01:39,  1.27s/it]
 94%|█████████▍| 1184/1261 [24:51<01:37,  1.27s/it]
 94%|█████████▍| 1185/1261 [24:52<01:36,  1.27s/it]
 94%|█████████▍| 1186/1261 [24:53<01:34,  1.26s/it]
 94%|█████████▍| 1187/1261 [24:55<01:34,  1.28s/it]
 94%|█████████▍| 1188/1261 [24:56<01:33,  1.27s/it]
 94%|█████████▍| 1189/1261 [24:57<01:32,  1.28s/it]
 94%|█████████▍| 1190/1261 [24:59<01:32,  1.30s/it]
 94%|█████████▍| 1191/1261 [25:00<01:36,  1.38s/it]
 95%|█████████▍| 1192/1261 [25:02<01:38,  1.43s/it]
 95%|█████████▍| 1193/1261 [25:03<01:34,  1.38s/it]
 95%|█████████▍| 1194/1261 [25:04<01:29,  1.34s/it]
 95%|█████████▍| 1195/1261 [25:05<01:26,  1.31s/it]
 95%|█████████▍| 1196/1261 [25:07<01:24,  1.29s/it]
 95%|█████████▍| 1197/1261 [25:08<01:22,  1.28s/it]
 95%|█████████▌| 1198/1261 [25:09<01:20,  1.28s/it]
 95%|█████████▌| 1199/1261 [25:10<01:18,  1.27s/it]
 95%|█████████▌| 1200/1261 [25:12<01:17,  1.27s/it]
 95%|█████████▌| 1201/1261 [25:13<01:15,  1.26s/it]
 95%|█████████▌| 1202/1261 [25:14<01:13,  1.25s/it]
 95%|█████████▌| 1203/1261 [25:15<01:12,  1.25s/it]
 95%|█████████▌| 1204/1261 [25:17<01:11,  1.25s/it]
 96%|█████████▌| 1205/1261 [25:18<01:11,  1.27s/it]
 96%|█████████▌| 1206/1261 [25:19<01:09,  1.26s/it]
 96%|█████████▌| 1207/1261 [25:20<01:07,  1.25s/it]
 96%|█████████▌| 1208/1261 [25:22<01:06,  1.25s/it]
 96%|█████████▌| 1209/1261 [25:23<01:06,  1.27s/it]
 96%|█████████▌| 1210/1261 [25:24<01:04,  1.26s/it]
 96%|█████████▌| 1211/1261 [25:25<01:02,  1.26s/it]
 96%|█████████▌| 1212/1261 [25:27<01:01,  1.25s/it]
 96%|█████████▌| 1213/1261 [25:28<01:00,  1.25s/it]
 96%|█████████▋| 1214/1261 [25:29<00:59,  1.26s/it]
 96%|█████████▋| 1215/1261 [25:31<00:58,  1.26s/it]
 96%|█████████▋| 1216/1261 [25:32<00:56,  1.26s/it]
 97%|█████████▋| 1217/1261 [25:33<00:55,  1.26s/it]
 97%|█████████▋| 1218/1261 [25:34<00:54,  1.26s/it]
 97%|█████████▋| 1219/1261 [25:36<00:52,  1.26s/it]
 97%|█████████▋| 1220/1261 [25:37<00:51,  1.26s/it]
 97%|█████████▋| 1221/1261 [25:38<00:50,  1.26s/it]
 97%|█████████▋| 1222/1261 [25:39<00:49,  1.27s/it]
 97%|█████████▋| 1223/1261 [25:41<00:48,  1.27s/it]
 97%|█████████▋| 1224/1261 [25:42<00:46,  1.27s/it]
 97%|█████████▋| 1225/1261 [25:43<00:45,  1.26s/it]
 97%|█████████▋| 1226/1261 [25:44<00:44,  1.27s/it]
 97%|█████████▋| 1227/1261 [25:46<00:43,  1.27s/it]
 97%|█████████▋| 1228/1261 [25:47<00:41,  1.27s/it]
 97%|█████████▋| 1229/1261 [25:48<00:40,  1.27s/it]
 98%|█████████▊| 1230/1261 [25:49<00:38,  1.25s/it]
 98%|█████████▊| 1231/1261 [25:51<00:37,  1.25s/it]
 98%|█████████▊| 1232/1261 [25:52<00:36,  1.25s/it]
 98%|█████████▊| 1233/1261 [25:53<00:34,  1.24s/it]
 98%|█████████▊| 1234/1261 [25:54<00:33,  1.24s/it]
 98%|█████████▊| 1235/1261 [25:56<00:32,  1.25s/it]
 98%|█████████▊| 1236/1261 [25:57<00:31,  1.25s/it]
 98%|█████████▊| 1237/1261 [25:58<00:29,  1.24s/it]
 98%|█████████▊| 1238/1261 [25:59<00:28,  1.25s/it]
 98%|█████████▊| 1239/1261 [26:01<00:27,  1.26s/it]
 98%|█████████▊| 1240/1261 [26:02<00:26,  1.25s/it]
 98%|█████████▊| 1241/1261 [26:03<00:24,  1.25s/it]
 98%|█████████▊| 1242/1261 [26:04<00:23,  1.25s/it]
 99%|█████████▊| 1243/1261 [26:06<00:22,  1.25s/it]
 99%|█████████▊| 1244/1261 [26:07<00:21,  1.25s/it]
 99%|█████████▊| 1245/1261 [26:08<00:20,  1.25s/it]
 99%|█████████▉| 1246/1261 [26:09<00:18,  1.25s/it]
 99%|█████████▉| 1247/1261 [26:11<00:17,  1.25s/it]
 99%|█████████▉| 1248/1261 [26:12<00:16,  1.25s/it]
 99%|█████████▉| 1249/1261 [26:13<00:15,  1.26s/it]
 99%|█████████▉| 1250/1261 [26:15<00:14,  1.28s/it]
 99%|█████████▉| 1251/1261 [26:16<00:12,  1.28s/it]
 99%|█████████▉| 1252/1261 [26:17<00:11,  1.29s/it]
 99%|█████████▉| 1253/1261 [26:18<00:10,  1.28s/it]
 99%|█████████▉| 1254/1261 [26:20<00:08,  1.26s/it]
100%|█████████▉| 1255/1261 [26:21<00:07,  1.26s/it]
100%|█████████▉| 1256/1261 [26:22<00:06,  1.25s/it]
100%|█████████▉| 1257/1261 [26:23<00:05,  1.27s/it]
100%|█████████▉| 1258/1261 [26:25<00:03,  1.28s/it]
100%|█████████▉| 1259/1261 [26:26<00:02,  1.27s/it]
100%|█████████▉| 1260/1261 [26:27<00:01,  1.26s/it]
[MoviePy] Done.
[MoviePy] >>>> Video ready: project_video_output.mp4 

CPU times: user 25min 25s, sys: 1min 37s, total: 27min 3s
Wall time: 26min 28s

Discussion of Results

Both videos show good results where the vehicles are detected on both sides of the road. I feel that hog subsampling, while faster, is a little bit vague compared to the windowing method. The parameters for the windowing method were intuitive and easy to tune. The only parameter that had made a big difference for the subsampling method was the scale parameter. This parameter, in my opinion, is not as intuitive as the overlap parameter for the windowing method. Nevertheless, by trial and experimentation, I was able to complete this exercise.

I also made plenty of mistakes. I did not know that when converting to YCrCb, the all the pixels of the image are expected to be normalized between 0-1. If the image pixels were between 0-255, the color space transformation returned NaNs.

When I used HSV, I noticed that the white car on the white pavement was never detected. YCrCb seemed like the best option, although I am yet to understand why this choice seems the best.

I also tried on some filtering to smoothen out the output between each frame. This enabled much smoother tracking of vehicles and also eliminated some of the false positives.

Step-7: Conclusion

Advanced vehicle detection has successfully been implemented.